sqli_labs 练习笔记

sqli_labs这个神奇的练习sql注入的地方真的挺不错的,小白的靶场。在练习之前,去看看PHP和sql的查询语句能使练习事半功倍。
话不多说,开始愉快的练习之旅(ง •_•)ง
这里贴一个学习链接传送门

Less-1 Error Based- 单引号字符

这里显示的sql语句能帮助我们更好的分析问题(当然不是自带的)
在url中输入?id=1可以看到

sqli_labs 练习笔记_第1张图片
id=1

可以通过改变id发现不同的name和password,这就获取不同的信息?当然没那么简单(;´д`)ゞ
看到第一节的标题很明显提示了我们这一节应该是和单引号有关系。那么试试这个呢
sqli_labs 练习笔记_第2张图片
?id=1'

于是发现出现了错误
那么 limit 0,1又是什么意思????
LIMIT 0,1,表示从第一个元素即其下标为0开始返回总数为1个的元素,也就是每次查询只会返回一个查询数据。继续撸起袖子,加油思考。
那么既然出错了,那就试试是不是真的存在sql漏洞
sqli_labs 练习笔记_第3张图片
?id=1'and '1‘=’2是一个为假的语句

果然执行了。看来是真的存在漏洞,这样就可以肆无忌惮的开始利用这漏洞进行查询了。
大体’剥洋葱’思路:字段--数据库名-数据库的表-表中的内容
1.
猜字段用 order by 语句,再用#将后面一个‘注释掉,构造成我们想要的语句
sqli_labs 练习笔记_第4张图片
出现问题了。。。

没有将#进行编码
sqli_labs 练习笔记_第5张图片
将#用%23替换就没有问题了

继续试试
sqli_labs 练习笔记_第6张图片

发现没有第四个字段,所以字段就是3了
2.
接着查询,union select(联合查询语句) 那三个字段
使用 union select 1,2,3 没有出现想要的数据库名啊,换成database()依旧不行,这是为什么?用函数试一试

sqli_labs 练习笔记_第7张图片

其中:
user()返回当前数据库连接使用的用户
database()返回当前数据库连接使用的数据库
version()返回当前数据库的版本
通常会使用concat-ws函数来将这些函数进行组合使用并显示出来。
char()函数为将里面的参数转化为相应的字符,32为空格,58为冒号(:),通过这样的方式可以绕过一些简单的过滤机制。
然而依旧不行,心中跑过一万只草泥马
于是通过搜索这个问题发现是因为在源码中mysql_fetch_array() 函数只能取其中一行来进行输出。所以只能显示这个bumb,后面的语句都没有显示出来。于是乎,嘿嘿嘿嘿,那就让前面的两个查询字段失效就OK了,那么从id上下手让他没有name和password,只有第三个查询字段。
sqli_labs 练习笔记_第8张图片
换成id=0或者字符或者负数

出现了,数据库名就是 security
3.
继续查询这个数据库的表格名
使用的group_concat函数一下把所有的表格名写出来,也可以改变limit的值来遍历表格。
sqli_labs 练习笔记_第9张图片
group_concat

于是这个数据库一共有四个表格,我们选择users表来继续
4.
依旧使用group_concat函数来查询,不过这次查询的是users表的列(column)
sqli_labs 练习笔记_第10张图片
users

得到列名以后,就开始可以用列名来得到数据了
5.
继续用group_concat,然而这个结果。。。。有点难以辨认啊
sqli_labs 练习笔记_第11张图片
黑脸.JPG

换一种姿势,加上concat_ws
sqli_labs 练习笔记_第12张图片
好看多了

总结:

1.关于注入的关键是找到sql语句的语法
常用查询语句是group_concat和concat_ws
2.单引号的注入是用以闭合之前的查询语句

Less-2 Error Based- 整型数字

首先给出?id=1看看

sqli_labs 练习笔记_第13张图片
id.PNG

在测试一下能不能字符型注入
id=1'.PNG

看来是不行的呢,但是看看这个错误信息他是多了一个’(单引号),那么可不可能这个sql语句之中不需要引号呢
来测试一下
sqli_labs 练习笔记_第14张图片
sqli_labs 练习笔记_第15张图片
出现问题了.PNG
sqli_labs 练习笔记_第16张图片
将+变成%2B.PNG

查询结果一样,如此看来是和字符没有关系了。
来直接构造注入语句吧
1.字段
sqli_labs 练习笔记_第17张图片

2.数据库名
sqli_labs 练习笔记_第18张图片

3.该干嘛干嘛
剩下的和第一节步骤一样了。(☆▽☆)

Less-3 Error Based- 带引号的单引号

老样子用?id=1'测试一哈

sqli_labs 练习笔记_第19张图片
直接报错了

我们看一下报错的信息(打红圈的地方)是 '1'') ,去掉注入的地方得到的是 ' '),也就是说比第一节的地方多了个 )
于是大胆推测他的select语句会不会是 (' ') ,俗话说还是要搞一下才知道( •̀ ω •́ )✧
sqli_labs 练习笔记_第20张图片
用%23注释掉多余的括号和单引号

啊哈,和id=1时的结果一样了。决定就是你了,剩下的步骤就和第一节差不多了。

Less-4 Error Based- 双引号

用常用的 id=1' 来试试。

sqli_labs 练习笔记_第21张图片
id=1‘.PNG

没有问题,那换一下本章所用的双引号来卡看。嗯,果然出现问题了。来看看看后半句 "1"),继续构造语句。
sqli_labs 练习笔记_第22张图片

嗯,和第三节相似
sqli_labs 练习笔记_第23张图片
用%23注释掉后面的双引号和括号.PNG

bingo!

Less-5 Double Injection-单引号

看到标题顿时一懵,什么是双注入啊,百度一会才晓得是这样的 当一个聚合函数(通常用count()),比如concat函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来 也就是说双注入是要有两个部分来注入,一个使他得到信息,一个使信息显示出来
根据试了试id来看果然啥都没有

sqli_labs 练习笔记_第24张图片
id.PNG

迷之 you are in.........

确定是否有漏洞

sqli_labs 练习笔记_第25张图片
1=1为真

sqli_labs 练习笔记_第26张图片
1=2为假没有显示

还是有的
加个单引号
sqli_labs 练习笔记_第27张图片
出错

看来和第一节的出错点是一样的。字段的查询也是OK的。
那么问题来了,如何让我们的查询信息显现出来让我们看到呢。
emmmmmmmm,就用出错信息来看到我们想要的数据库名之类的。如何构造这个报错函数少不了count( ),(这是个学习链接,关于为什么这样构造)
group by 作用是分组(这个函数很有用)
rand 的使用是为了报错
于是乎
sqli_labs 练习笔记_第28张图片
终于等到你~

不过,由于rand的随机性还是要刷新几次才看得到,同理user,和version的得到也是这样的。but,用rand(0)
2就一定会出现。
接着查询表
sqli_labs 练习笔记_第29张图片
一个一个来的节奏

这里本来想用group_concat的来查询的但是弄不出来,技术不够只有手动了
继续学习group_concat的用法, group_concat学习链接之一猜测是因为group_concat是多行查询拼接在一起然后返回的结构,而rand只能返回一个
差列就和之前差不多
sqli_labs 练习笔记_第30张图片
继续流下没有技术的眼泪

一个一个的查询...........感觉小镰刀并不能战胜机械化
数据:
sqli_labs 练习笔记_第31张图片
嘤嘤嘤

Less-6 Double Injection-双引号

测试?id=1",出错了

sqli_labs 练习笔记_第32张图片
似曾相似的感觉

嗯,剩下的和第五节的步骤一样了

你可能感兴趣的:(sqli_labs 练习笔记)