本帖最后由 kal 于 2021-11-5 20:26 编辑
0x01 环境准备 1.Seasy代码审计系统
2.phpStudy
0x02 源码分析
- if (strpos($r_url,"siteconfig.php")==0 && strpos($r_url,"label")==0 && strpos($r_url,"template.php")==0) {
- foreach ($_GET as $get_key=>$get_var){ stop($get_var);}
- foreach ($_POST as $post_key=>$post_var){ stop($post_var); }
- foreach ($_COOKIE as $cookie_key=>$cookie_var){ stop($cookie_var); }
- foreach ($_REQUEST as $request_key=>$request_var){ stop($request_var); }
- }
复制代码 <注:由于厂家等原因,这里只展示部分关键代码>
此段代码的所用是依次将来自 GET 、POST、COOKIE、REQUEST的请求进行转义。
( 补充:foreach(),用于遍历数组中的每个键/值。例如:foreach ($array as $value),每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。)
针对本代码,简单来说就是对字符型请求的每个元素,依次进行stop()函数的检测和过滤。
开发人员为了安全,对基本上所有的请求都进行了处理,我们为了寻找漏洞只能另寻其路。
0x03 漏洞挖掘
我们所想要的,即绕过这个检查,我们关注这个函数的条件代码:
- if (strpos($r_url,"siteconfig.php")==0 && strpos($r_url,"label")==0 && strpos($r_url,"template.php")==0) {
复制代码strpos()函数: 主要是用来查找字符在字符串中首次出现的位置。
即:当我们所发送的url中,含有siteconfig.php、label、template.php此类字符串时,以下的检查不会被执行。
下面我们来做个对比:
告警了
- a=siteconfig.php&b=select
复制代码
未告警
0x03 结语
由开发者代码不难看出,开发者事先想的是:当进入siteconfig.php、template.php这类文件时,不进行检查。
出于方便,他便直接用strpos进行判断
具体漏洞利用本次不给出,其思路大致为:继续分析其他文件,根据代码逻辑,拼接语句使注入语句成功闭合。
|