【代码审计】某CMS-sql注入漏洞审计过程
说在前面
本次审计纯属分享审计过程和审计思路,请勿用于非法用途!
审计过程
拿到源码,我们可以本地搭建,进入后台看看有什么可能存在漏洞功能块。
我们可以看到里面有一些功能,里面有一个sql的写入框,有问题看看有没有过滤,我们随便输入东西看一看
看来存在过滤
但是我们有源码不怕,通过报错信息里有一个非法操作,放到工具里面搜搜看
发现里面1到17个都有感叹号,而报错里面没有,说明这个程序运行是在最后一个里面,发现后面两个都是在同一个php文件里面,我们先看第一个
后来发现最后面两个搜索结果都是同一个地方,可能是搜索结果出现问题了
回到正题,通过这个搜索我们还不能判断是否程序运行在这里,我们再看看里面的参数有title,limits,orders,isall,sqls等等,他们都是通过frparam函数将这些参数里面的具体内容传递给$data这个数组里面,既然是参数可以肯定在抓包的时候会出现,我们就抓个包试试
在前面那个功能块里面点击保存,并抓包
我们可以看到里面的参数和我们源码里面看到的参数一样且sql的输入框框是sqls这个参数,基本可以肯定是这里了
接下来就是代码审计了
我们可以看到他做了一个if判断,通过frparam函数的运行结果是否等于1,我们看看frparam函数,这个函数一看就是自定义的,对于自定义的函数肯定有function frparam这个函数声明,我们去搜一搜。
找到了,点进去看看
可以看到它是获取URl的参数值,通过前面调用这个函数,他已经go和1传过来了,所以这里的$str和$int为go和1。
这里$data = $this->_data;意思是把前端的所有数据传过来,这时候再判断$str是否为空,再通过这个array_key_exists函数判断$str是否在不在$data里面,显然都不满足,所以跳过,后面他在$method变量判断,显然是为空的,因为我们没有赋值给他就默认了,然后把 $data[$str]赋值给$value了,最后再return format_param($value,$int,$default);看一看format_param函数。
这里他参数过滤,格式化了,通过前面传来的int=1,我们直接跳到case 1:,里面他通过SafeFilter函数进行了过滤,我们定位看看
可以看到他里面过滤了xss攻击了,简单看了一下,是过滤xss的,顺便看下这个框框有没有xss漏洞,通过 $arr = preg_replace($ra,'',$arr)这个函数判断$arr有没有在$ra里面,有就替换成空了,看到$ra里面就过滤了一些基本的js语句,可能会有,然后再接着看下去,就回到前面了。
可以看到他又把传来的$值给html实体了。。。没戏。
不慌,我们接着看下去。
可以看到他判断php版本了,大于等于7.4就会通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,如果没有大于等于,就会判断是否开启魔术方法了,没有就会和上面一样,通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,说到这我只能说这代码写的真严谨。。。
好了,这里看完了,回到前面。
这里return的值就是层层过滤后的$value的值了,这里运行结束,然后我们再返回去看前面。
好了,一个frparam函数终于看完了,后面好多个都是通过这个frparam层层筛选的和前面一样,就不多说,我们再往下看。
(太长了,截两张)这里他对这个sqls参数进行了stripos函数判断,这个stripos函数是查找我们指定的字符在字符串中第一次出现的位置,如果有就会输出位置也就是不等于false,也就是为真了,代码里他通过多次或逻辑,只要有一个为真就会执行if里面的”非法操作“这个代码,所以我们只要绕过这些判断,也就是全为假,可以看到他对update,delete,insert,drop,truncate进行了对比,我们只要不适用这些函数就OK了。
看到我箭头画的就是执行顺序了,他直接就带入执行了,说明存在漏洞。
漏洞验证
我们只要的插入sql语句的时候不要有上面的敏感字符就可以了,payload我相信大家都会写,我就不废话了,就直接放sqlmap跑了。
- 本文作者: yggcwhat
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/269
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!