![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QT61058-0.jpg)
文章插图
一.漏洞说明这个漏洞涉及到了MySQL中比较有意思的两个知识点以及以table作为二次注入的突破口,非常的有意思 。
此cms的防注入虽然是很变态的,但是却可以利用mysql的这两个特点绕过防御 。本次的漏洞是出现在ndex.class.php中的likejob_action()和saveresumeson_action()函数,由于这两个函数对用户的输入没有进行严格的显示,同时利用mysql的特点能够绕过waf 。
PS:此漏洞的触发需要在WAP环境下,所以在进行调试的时候需要修改浏览器的ua为Mozilla/5.0 (linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36 。
【某php开源cms有趣的二次注入】
二.漏洞分析mysql特点
特点1
传统的插入方式可能大家想到的都是insert into test(id,content,title) values(1,'hello','hello') 。
如果我们仅仅值需要插入一条记录,则使用insert into test(content) values('hello2') 。
如下图所示:
![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QT64147-1.jpg)
文章插图
但是实际上还存在另外一种方式能够仅仅值插入一条记录 。
insert into test set content='hello3';
![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QT62U6-2.jpg)
文章插图
可以看到这种方式和insert into test(content) values('hello2')是一样的 。
说明插入数据时,利用values()和通过=指定列的方式结果都一样
特点2
我们知道mysql中能够使用十六进制表示字符串 。如下:
![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QTD000-3.jpg)
文章插图
其中0x68656c6c6f表示的就是hello
这是一个很常见的方式!
除了使用十六进制外,还可以使用二进制的方式进行插入 。
hello的二进制是01101000 01100101 01101100 01101100 01101111,那么我们的SQL语句还可以这样写,insert into test set content=0b0110100001100101011011000110110001101111 。
这种方式和insert into test(content) values (0b0110100001100101011011000110110001101111)是一样的 。
mysql不仅可以使用十六进制插入,还可以使用二进制的方式插入
![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QT61635-4.jpg)
文章插图
waf防护分析
waf的防护是位于config/db.safety.php
其中的gpc2sql()过滤代码如下:
function gpc2sql($str, $str2) {if (preg_match("/select|insert|update|delete|load_file|outfile/is", $str)) {exit(safe_pape());}if (preg_match("/select|insert|update|delete|load_file|outfile/is", $str2)) {exit(safe_pape());}$arr = array("sleep" => "Sleep", " and " => " an d ", " or " => " Or ", "xor" => "xOr", "%20" => " ", "select" => "Select", "update" => "Update", "count" => "Count", "chr" => "Chr", "truncate" => "Truncate", "union" => "Union", "delete" => "Delete", "insert" => "Insert", """ => "“", "'" => "“", "--" => "- -", "(" => "(", ")" => ")", "00000000" => "OOOOOOOO", "0x" => "Ox");foreach ($arr as $key => $v) {$str = preg_replace('/' . $key . '/isU', $v, $str);}return $str;}
可以看到将0x替换为了Ox,所以无法传入十六进制,但是我们却可以利用mysql中的二进制的特点,利用0b的方式传入我们需要的payload 。index.class.php漏洞分析
漏洞是位于wap/member/model/index.class.php中,漏洞产生的主要函数是位于likejob_action()和saveresumeson_action()中 。
我们首先分析likejob_action() 。
likejob_action()的主要代码如下:
![某php开源cms有趣的二次注入](http://img.jiangsulong.com/220410/1QT61918-5.jpg)
文章插图
而DB_update_all()的代码如下:
function DB_update_all($tablename, $value, $where = 1,$pecial=''){if($pecial!=$tablename){$where =$this->site_fetchsql($where,$tablename);}$SQL = "UPDATE `" . $this->def . $tablename . "` SET $value WHERE ".$where;$this->db->query("set sql_mode=''");$return=$this->db->query($SQL);return $return;}
也就是说,当数据进入到DB_update_all()之后就不会有任何的过滤 。
推荐阅读
- PHP生命周期及fpm的运作方式
- 开源交换机操作系统
- PHP 安全问题入门:10 个常见安全问题 + 实例讲解
- Docker 安装 Nginx、PHP、MySQL、Tomcat、Python、Redis、Apache
- PHP的isset、is_null、empty()使用总结
- PHP中钩子的理解与实例教程
- PHP生成静态页面效果
- CPU处理器|打破x86/ARM垄断!中科院RISC-V开源处理器“香山”新归属敲定
- 开源免费的多功能数据库管理软件DBeaver
- PHP安装imagick扩展踩过的坑