此文并非抄袭,而是把文章中作者没写清楚的知识点写出来,然后更为人性化的输出来(吹个牛皮),也是为了让自己印象更加深刻~
首先第一步作者使用的注入点代码是
<?php
...
$id=$_REQUEST['id'];
$query = "SELECT * FROM admin WHERE id = $id ";
...
可以看到上面的代码是直接将$id参数代入然后执行sql语句的,然后下面就是这里加上waf后绕过的总结
什么是waf
waf呢可以当作是王者荣耀里面的防御塔,然后里面有一个玩家在想,我去挂机一会,然后在防御塔里面(非泉水,哈哈哈哈)待着就不会死,但是他们忘记了,英雄刘禅的4个技能是可以让防御塔眩晕的,而且还有干扰技能可以让防御塔眩晕一段时间,那么这个时间内如果输出伤害足够的话就可以让在防御塔下面的对手打shi,那么这个防御塔类似就是waf,但是他并不是绝对的安全的,就好像我说的那几个英雄和技能之类的,所以想要解决安全的根本问题,还是要在代码处将功能点写安全才行。
绕过总结
1、使用网站白名单
一般来说waf都是用正则匹配Url中是否存在某个值,如果存在一个值是waf中设置了拦截的,那么他是不能够访问的,就比如我们经常在url的参数中输入了and sleep()、union select、select这些都是会给拦截的,那么这里就是因为有waf检测到了url的参数中带有非法字符,但是在不常出现的情况下,我们需要访问一个登陆管理界面的Url为www.xxx.com/admin.php?action=select,那么这里是存在select的,那么waf就会去拦截的,所以就会有一个功能,就是网站后台白名单,所以如果管理员很调皮的设置了一些常用的注入语句为白名单的话,基本上他就会被祭tian的。

2、利用静态资源方式绕过waf

这里也讲的比较清楚,如果还是不懂的话我还是讲一下把。
可以看到图中访问的Url是
www.xxx.com/test.php/1.png?id=1 union select 1,2,schema_name from information_schema.SCHEMATA
可能有人会问(应该是懒人把,因为勤快的人会自己搭建来尝试的),这里的1.png是不存在的,为什么可以访问呢(这里我也不懂,而且也搜索不到,但是我猜测是php把/后面的内容当参数了但是我去打印了一下发现并没有,5555,如果有知道准确原因的师傅可以来告诉我一下),然后我自己搭建了一下,如下图

虽然我不懂为什么在/后面加上任何参数都可以照常访问,但是我知道他这里绕过的具体方式,就是一般的waf搭建起来的话要去检查每个用户访问的url,这相当的耗费性能,所以这个waf不会去拦截静态的文件也就是图片文件,css后缀文件和js后缀文件这些,那么原文中访问的www.xxx.com/test.php/1.png?id=1 union select 1,2,schema_name from information_schema.SCHEMATA就是把这个当作静态文件了,所以没有做拦截~
3、缓冲区溢出
这个漏洞我不太懂(所以直接看原文把,啊哈哈哈哈),但是感觉非常神,所以有空的时候再去了解一下
4、uri参数溢出
这个也是没有了解过的绕过方法,实在是学习了一大波了

这里也讲的非常清楚啦~,所以不再说了~
5、在同时提交GET、POST请求时,会进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。
因为这个比较好理解,而且原文也实际操作了,所以不再重复啦~
6、利用协议解析的差异来绕过
原文里是构造了怎么一个代码,如下
<html> <head></head> <body>
<form action="http://192.168.204.128/test.php" method="post" enctype="multipart/form-data">
<input type="text" name="id">
<input type="submit">
</form>
</body> </html>
然后在浏览器打开并在输入框中输入参数

然后我在本地测试一下看看能不能用这个方法来传递参数
1 . 创建了一个hello.html文件,他的代码是
<html>
<head></head>
<body>
<form action="http://127.0.0.1/hello.php" method="get" enctype="multipart/form-data"> <!--method的值是什么,他就是以什么请求方式传递的-->
<input type="text" name="id">
<input type="submit">
</form>
</body>
</html>
2 . 创建了一个hello.php文件,他的代码是
<?php
var_dump( $_GET );
然后在浏览器打开hello.html页面,如下

然后点击查询

可以看到链接成功带了id=only_free所以说用这个方式也可以传递参数的,学习了~
7、编码绕过
利用编码绕过检测很容易理解的,就比如你在考试的时候你想作弊,但是你旁边有个人工智能机器人,检查到你说话中如果存在答案、看下、第x题等作弊相关的中文词的话就会警报,那么如果你改用英语,法语,手语的话就没办法检测出来,那么这个waf也是一样的,如果只判断了union select不能存在的话我们可以这样Union Select用大写的方式绕过,那么原文中的绕过方式是

这里利用的是Url编码


8、利用Mysql数据库的一些特性,绕过WAF的防御规则
如果waf过滤了union select以及大写小写的话我们可以用Mysql数据库的特性来绕过,首先打开我自己的mysql命令行来讲解

可以看到上图中我们输入了
select 123
和
select/**/123/*!*/;
他们输出的结果一样,说明空格可以用/**/来代替

那么原文处的讲解肯定很容易看明白了吧~
自动化Bypass
这个脚本就是根据%0a+内联注释为例,主要是针对
union select from
等关键字替换,Payload中的部分关键字可能会被waf拦截,需要一步步调试,测试,总结规律,因为代码不是看的非常懂,所以暂不讲解~