某日和某基友一起挖洞,记录一下,过程忽略,折腾几天找到如下漏洞。
程序过滤
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 注入
文章开头处我贴出了过滤代码,这个代码没有对 "\" 反斜杠进行过滤,因此使用"\" 可以报错,不过过滤了单引号,无法闭合语句,也就无法注入,需要找到一处没有单引号的语句,但是我没找到,不过找到了一处支持双写的语句
还有一处未授权访问和绕过登陆脱数据的洞,时间关系这里就不继续复述了。发个文凑下博客收录。