### 简要描述: No check out。 6月份了 不知道是自己倒数的多少个洞了。 2014年6月2日 16:06:55 最后写一个 写了就去上晚自习了。 时间原因 怕迟到 可以注入的地方很多 我就贴两个出来就算了。 demo成功。 ### 详细说明: 总所周知 74cms在/user/user_reg.php注册的时候 *用户名: 只能包含中英文、数字和下划线 不允许注册特殊字符 但是在plus/ajax_user.php中 也能注册。 在这里就没过滤特殊字符了。 ``` elseif ($act=='do_reg') { $captcha=get_cache('captcha'); if ($captcha['verify_userreg']=="1") { $postcaptcha=$_POST['postcaptcha']; if ($captcha['captcha_lang']=="cn" && strcasecmp(QISHI_DBCHARSET,"utf8")!=0) { $postcaptcha=iconv("utf-8",QISHI_DBCHARSET,$postcaptcha); } if (empty($postcaptcha) || empty($_SESSION['imageCaptcha_content']) || strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0) { exit("err"); } } require_once(QISHI_ROOT_PATH.'include/fun_user.php'); $username = isset($_POST['username'])?trim($_POST['username']):exit("err"); $password = isset($_POST['password'])?trim($_POST['password']):exit("err"); $member_type = isset($_POST['member_type'])?intval($_POST['member_type']):exit("err"); $email =...
### 简要描述: No check out。 6月份了 不知道是自己倒数的多少个洞了。 2014年6月2日 16:06:55 最后写一个 写了就去上晚自习了。 时间原因 怕迟到 可以注入的地方很多 我就贴两个出来就算了。 demo成功。 ### 详细说明: 总所周知 74cms在/user/user_reg.php注册的时候 *用户名: 只能包含中英文、数字和下划线 不允许注册特殊字符 但是在plus/ajax_user.php中 也能注册。 在这里就没过滤特殊字符了。 ``` elseif ($act=='do_reg') { $captcha=get_cache('captcha'); if ($captcha['verify_userreg']=="1") { $postcaptcha=$_POST['postcaptcha']; if ($captcha['captcha_lang']=="cn" && strcasecmp(QISHI_DBCHARSET,"utf8")!=0) { $postcaptcha=iconv("utf-8",QISHI_DBCHARSET,$postcaptcha); } if (empty($postcaptcha) || empty($_SESSION['imageCaptcha_content']) || strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0) { exit("err"); } } require_once(QISHI_ROOT_PATH.'include/fun_user.php'); $username = isset($_POST['username'])?trim($_POST['username']):exit("err"); $password = isset($_POST['password'])?trim($_POST['password']):exit("err"); $member_type = isset($_POST['member_type'])?intval($_POST['member_type']):exit("err"); $email = isset($_POST['email'])?trim($_POST['email']):exit("err"); if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0) { $username=iconv("utf-8",QISHI_DBCHARSET,$username); $password=iconv("utf-8",QISHI_DBCHARSET,$password); } $register=user_register($username,$password,$member_type,$email); if ($register>0) { $login_js=user_login($username,$password); $mailconfig=get_cache('mailconfig'); ``` 这里注册后 又直接登录 造成了二次注入。 看一下username column 能存多少字符。 ---------------------+---------------------+------+-----+---------+------------ ---+ Field | Type | Null | Key | Default | Extra | ---------------------+---------------------+------+-----+---------+------------ ---+ uid | int(10) unsigned | NO | PRI | NULL | auto_increm nt | utype | tinyint(1) unsigned | NO | | 1 | | username | varchar(100) | NO | UNI | NULL | 100个 绰绰有余。 测试一下demo [<img src="https://images.seebug.org/upload/201406/0216074618c28d5a7939b7c2ae9c49a7a76f62ce.jpg" alt="79.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/0216074618c28d5a7939b7c2ae9c49a7a76f62ce.jpg) 报错了 出库未过滤 造成了注入。 第二个出库的位置 在user/user_pms.php中 ``` elseif($act=="add_save") { $setsqlarr['msgtype']=2; $setsqlarr['msgfrom']=trim($_SESSION['username']); $setsqlarr['msgfromuid']=intval($_SESSION['uid']); $toname=trim($_GET['toname']); $setsqlarr['message']=trim($_GET['msg']); if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0) { $toname=iconv("utf-8",QISHI_DBCHARSET,$toname); $setsqlarr['message']=iconv("utf-8",QISHI_DBCHARSET,$setsqlarr['message']); } $msgtouser= $db->getone("select * from ".table('members')." where username = '{$toname}' LIMIT 1"); if (empty($msgtouser)) { exit('收件人不存在!'); } elseif ($msgtouser['uid']==$_SESSION['uid']) { exit("您不能给自己发消息!"); } elseif ($_SESSION['utype']=='1' && $msgtouser['utype']=='2') { $sql = "select did from ".table('company_down_resume')." WHERE company_uid = '{$_SESSION['uid']}' AND resume_uid='{$msgtouser['uid']}' LIMIT 1"; $info=$db->getone($sql); if (empty($info)) { exit("您没有下载过会员<strong>{$msgtouser['username']}</strong>创建的简历,下载过简历后才可以给TA发短消息!"); } } $setsqlarr['msgtouid']=$msgtouser['uid']; $setsqlarr['msgtoname']=$msgtouser['username']; $setsqlarr['dateline']=time(); $setsqlarr['new']=1; $setsqlarr['replytime']=$setsqlarr['dateline']; $setsqlarr['replyuid']=$setsqlarr['msgfromuid']; inserttable(table('pms'),$setsqlarr); ``` ``` $msgtouser= $db->getone("select * from ".table('members')." where username = '{$toname}' LIMIT 1");//这里出库 $setsqlarr['msgtouid']=$msgtouser['uid']; $setsqlarr['msgtoname']=$msgtouser['username']; ``` 这里把账户的名字直接给了这数组 然后带入了inserttable(table('pms'),$setsqlarr) insert 语句中。 [<img src="https://images.seebug.org/upload/201406/0216112293b94ff356689b6c39a93ea70a8ac7ce.jpg" alt="80.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/0216112293b94ff356689b6c39a93ea70a8ac7ce.jpg) ### 漏洞证明: 100个字符 语句太好构造了。 我就不构造了。 晚自习去了 拜拜。