### 简要描述: 代码审计第三发 ### 详细说明: 看代码 include/fun_company.php 963-968行 ``` function action_user_setmeal($uid,$action) { global $db; $sql="update ".table('members_setmeal')." set `".$action."`=".$action."-1 WHERE uid=".intval($uid)." AND effective=1 LIMIT 1"; return $db->query($sql); } ``` 可以看到$action未做处理就进入SQL语句了。下面看看哪些地方调用了action_user_setmeal这个函数 有以下这些文件 [<img src="https://images.seebug.org/upload/201506/121334477e35798dc1a19f47bd2fb7c1331fc474.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121334477e35798dc1a19f47bd2fb7c1331fc474.png) 其中我划线的文件,变量就是我们可控的。下面看看那三个文件 1.plus/ajax_get_promotion.php 263-264行 ``` $user_pname=trim($_GET['pro_name']); action_user_setmeal($_SESSION['uid'],$user_pname); //更新套餐中相 ``` 可看到$user_pname来自用户传过去pro_name参数,而且并未做处理,就进入了action_user_setmeal 函数,所以造成注入。 2.user/company/company_ajax.php 266-267行 3.user/company/company_promotion.php 262-263行 这两处和第一处一样,代码就不贴了。 下面证明 ### 漏洞证明: 我们用第二处来证明,因为这一出,更直观。...
### 简要描述: 代码审计第三发 ### 详细说明: 看代码 include/fun_company.php 963-968行 ``` function action_user_setmeal($uid,$action) { global $db; $sql="update ".table('members_setmeal')." set `".$action."`=".$action."-1 WHERE uid=".intval($uid)." AND effective=1 LIMIT 1"; return $db->query($sql); } ``` 可以看到$action未做处理就进入SQL语句了。下面看看哪些地方调用了action_user_setmeal这个函数 有以下这些文件 [<img src="https://images.seebug.org/upload/201506/121334477e35798dc1a19f47bd2fb7c1331fc474.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121334477e35798dc1a19f47bd2fb7c1331fc474.png) 其中我划线的文件,变量就是我们可控的。下面看看那三个文件 1.plus/ajax_get_promotion.php 263-264行 ``` $user_pname=trim($_GET['pro_name']); action_user_setmeal($_SESSION['uid'],$user_pname); //更新套餐中相 ``` 可看到$user_pname来自用户传过去pro_name参数,而且并未做处理,就进入了action_user_setmeal 函数,所以造成注入。 2.user/company/company_ajax.php 266-267行 3.user/company/company_promotion.php 262-263行 这两处和第一处一样,代码就不贴了。 下面证明 ### 漏洞证明: 我们用第二处来证明,因为这一出,更直观。 首先注明:需要后台的运营模式是套餐模式。(虽然默认的不是,但是总会用网站的是需要第二种模式的。) [<img src="https://images.seebug.org/upload/201506/121346318fbb758feb16d7ea888999872593e258.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121346318fbb758feb16d7ea888999872593e258.png) 1.注册一个企业账号 2.发布一个职位 3.来到推广的地方 [<img src="https://images.seebug.org/upload/201506/121349138b9ff92565ceac4f6cdec0de419f00d3.png" alt="4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121349138b9ff92565ceac4f6cdec0de419f00d3.png) 可任意点击红框内的一个按钮,这里拿置顶来测试。 点击置顶之后,截包,我划红线的地方就是可控的参数 [<img src="https://images.seebug.org/upload/201506/1214093548f70add8e823279e0d50eeba5221440.png" alt="8.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/1214093548f70add8e823279e0d50eeba5221440.png) 看看SQL语句监控 [<img src="https://images.seebug.org/upload/201506/12141424c7bc5db04ad30e4d5188b2b82b1d9d5e.png" alt="6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/12141424c7bc5db04ad30e4d5188b2b82b1d9d5e.png) 完美执行,这里我们就可以该自己的用户类型,变成高级会员 哈哈哈。 因为有waf,绕不过,所以只能用布尔盲注。 所以找了找页面变化的地方。 加载payload之前的 [<img src="https://images.seebug.org/upload/201506/121410479eb4a30ce2aa58c494284745e2750853.png" alt="7.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121410479eb4a30ce2aa58c494284745e2750853.png) 加了payload之后的是 [<img src="https://images.seebug.org/upload/201506/121411277b01dca5074c5036fcfc74057ef8a260.png" alt="9.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/121411277b01dca5074c5036fcfc74057ef8a260.png) 免费会员就成了我们提交的34了,此处就可以作为布尔盲注判断的地方,进行注入。(可以写脚本跑的)。 至于payload中的uid参数,抓个包就能看见是多少了 其他两处都差不多