SQL注入的基本防御与绕过(中高级篇)
-
DVWA medium(中)级别SQL注入代码分析
-
•mysql_real_escape_string()函数
-将单引号【'】、双引号【"】、反斜杠【\】、空字符【null】等字符进行转义。
•addslashes()函数
-功能与mysql_real_escape_string()函数相近。
•mysql_real_escape_string()只能用于MySQL数据库,而addslashes()函数则是通用的。
-
-
判断数字型和文本型注入:
-
•数字型注入与文本型的最大区别就是不需要考虑引号闭合。
•可以采用简单的算术运算来判断是否是数字型注入。
-比如输入2以及3-2(+号在浏览器url栏是空格的意思),发现两者显示的结果都是一样的,就基本可以断定参数是数字型。
-
-
绕过去单引号的限制(只是针对参数而非单引号本身)
-
•编码绕过
-将那些必须放在引号内的参数转换成十六进制ASCII码,MySQL能够自动识别出这些十六进制ASCII码所对应的字符。
-可以采用专门的转换工具或者是Burpsuite中的Decoder模块(Decode as ASCII hex)进行编码。
-推荐使用Python中bytes对象的hex()方法进行编码转换(记得转换后要加0x)
-
![image-20260427060702578]()
-注意,只能对参数进行编码绕过,不适用于SQL语句。
-
-
DVWA high级别SQL注入代码分析
-
•is_numeric()函数
-判断用户输入的数据是否是数字型
-
-
DVWA登录页面的防注入处理
-
-
过滤敏感关键字
-
•str_replace()函数
-过滤指定的字符(如下图,将sql语句全部过滤)
-可用于过滤payload中经常用到的关键字
-
![image-20260427061147251]()
•SQL注入的防御思路
-在代码层面注意避免产生漏洞
-配置WAF防火墙进行拦截
-
-
复写绕过(针对关键字过滤的方式)
-
•复写绕过
-在关键字中包含关键字,比如sselectelect,将其中的select过滤掉之后,剩下的字符正好又可以组成select。
•CTF例题
-BUUCTF--极客大挑战2019-BabySQL
-
利用Burpsuite测试过滤关键字:利用intruder模块结合字典文件测试过滤关键字
-
-
对过滤空格的绕过(用/**/和())
-
利用注释符/**/绕过空格过滤
-在SQL语句中加入/**/,就等同于空格。
-包含在/和/之间的代码将不起作用
![image-20260427064639971]()
-
•利用()绕过空格过滤
-一条SQL语句可以分为指令和参数两部分
select username from users;
select和from属于指令,username和users属于参数
空格用来区分指令和参数,只要将参数用小括号括起来,也可以达到相同的效果
![image-20260427064730273]()
-
BUUCTF--Web-[WUSTCTF2020]颜值成绩查询(/**/似乎有点问题)
-




