某日和某基友一起挖洞,记录一下,过程忽略,折腾几天找到如下漏洞。
程序过滤
function getValue($name, $type = 'str') { $data = array(' ', '\'', '<', '>', '"', '<', '>', '"', 'script', 'insert', 'delete', 'update', 'select', 'drop', 'exec', 'and', 'or', 'eval'); if ($type == 'array') { $value = I($name); foreach ($value as $key => $i) { $value[$key] = str_ireplace($data, '', $i); } } else { $value = str_ireplace($data, '', I($name)); switch ($type) { case 'str': $value = strval($value); break; case 'int': $value = intval($value); break; case 'float': $value = floatval($value); break; } } return $value; } function getContent($name) { $data = array('script', 'insert', 'delete', 'update', 'select', 'drop', 'exec', 'and', 'or', 'eval'); $value = I($name, '', 'htmlspecialchars'); $value = str_ireplace($data, '', $value); return $value; } function getData($database, $type, $where = '', $limit = '', $order = 'id asc', $group = '') { if ($type == 'all') { $data = M($database)->where($where)->limit($limit)->order($order)->group($group)->select(); } else { $data = M($database)->where($where)->limit($limit)->order($order)->find(); } return $data; }
1.pay() 函数中参数未过滤导致 sql 注入
可以看到,Handle 控制器下的 pay() 没有过滤,不过构造需要知道 getAlipayInfo() 的定义
知道 key 的值,还需要知道 sign 签名的值,这个值经过加密处理:
strtoupper(md5($tno . $payno . $money . $md5key))
2.注册处 X-Forwarded-For SQL注入
3.反斜杠配合双写进行 sql 注入
文章开头处我贴出了过滤代码,这个代码没有对 "\" 反斜杠进行过滤,因此使用"\" 可以报错,不过过滤了单引号,无法闭合语句,也就无法注入,需要找到一处没有单引号的语句,但是我没找到,不过找到了一处支持双写的语句
还有一处未授权访问和绕过登陆脱数据的洞,时间关系这里就不继续复述了。发个文凑下博客收录。
本文作者为Mr.Wu,转载请注明,尊守博主劳动成果!
由于经常折腾代码,可能会导致个别文章内容显示错位或者别的 BUG 影响阅读; 如发现请在该文章下留言告知于我,thank you !
很棒 学习了