漏洞描述
OURPHP(傲派建站系统)是一款使用PHP语言开发的网站内容管理系统,开发商为哈尔滨伟成科技有限公司。其注册页面处存在一个SQL漏洞。
漏洞原因
对参数进行过滤的过滤函数容易绕过。
漏洞分析
首先看到/client/user/ourphp_play.class.php
1 | //处理注册用户 |
可以看到,用户注册时所使用的用户名,密码,邮箱等相关信息会经过dowith_sql
这个过滤函数过滤,然后insert
到数据库中。问题就出现在这个dowith_sql
函数,跟进
1 | /*防注入函数*/ |
这个过滤函数写的很有问题。
对于关键词的检测,太容易绕过了,
selselectect
->select
。没有过滤
\
,虽然前面用了addslashes
, 但是后面又把单引号置空了,这就会让我们成功的引入\
。看下流程,
'\
–>addslashes
–>\'\\
–>单引号置空
–>\\\
。 这也是这个漏洞的关键,通过引入\
将之后的'
转义掉,之后在利用一个可控点将payload注入。
所以要利用这个点,有一个条件,就是必须要有两个连续可控的点。一个引入\
,一个引入payload。要让SQL语句正常执行,可控点必须是连续的。
看下这个SQL语句
1 | $query = $db -> insert("`ourphp_user`","`OP_Useremail` = '".dowith_sql($userloginemail)."',`OP_Userpass` = '".dowith_sql(substr(md5(md5($_REQUEST["OP_Userpass"])),0,16))."',`OP_Usertel` = '".dowith_sql($userlogintel)."',`OP_Userclass` = '".$ourphp_usercontrol['group']."',`OP_Usersource` = '".$introducer."',`OP_Usermoney` = '".$ourphp_usercontrol['money'][0]."',`OP_Userintegral` = '".$ourphp_usercontrol['money'][1]."',`OP_Userip` = '".dowith_sql($_POST["ip"])."',`OP_Userproblem` = '".dowith_sql($_POST["OP_Userproblem"])."',`OP_Useranswer` = '".dowith_sql($_POST["OP_Useranswer"])."',`OP_Userstatus` = 1,`OP_Usercode` = '".randomkeys(18)."',`time` = '".date("Y-m-d H:i:s")."'",""); |
这里选择OP_Userproblem
和OP_Useranswer
来进行注入。通过OP_Userproblem
引入\
,将payload的通过OP_Useranswer
传进去。构造payload的时候可以将payload的执行结果输出到前台,ourphp_user
中有个OP_Username
(用户名)会显示在前台,所以可以将payload的结果传到OP_Username
中,执行结果在前台的用户个人资料中可以看到。
漏洞复现
注册,用 burpsuite 抓包,将OP_Userproblem
修改为'\
,将OP_Useranswer
改为,`OP_Username`=user()--+-
。
此时可以看到mysql的日志,payload 成功带入到 SQL 语句并执行了。
前台登陆,查看个人资料,可以看到user()
的执行结果。