sqli_labs这个神奇的练习sql注入的地方真的挺不错的,小白的靶场。在练习之前,去看看PHP和sql的查询语句能使练习事半功倍。
话不多说,开始愉快的练习之旅(ง •_•)ง
这里贴一个学习链接传送门
Less-1 Error Based- 单引号字符
这里显示的sql语句能帮助我们更好的分析问题(当然不是自带的)
在url中输入?id=1可以看到
可以通过改变id发现不同的name和password,这就获取不同的信息?当然没那么简单(;´д`)ゞ
看到第一节的标题很明显提示了我们这一节应该是和单引号有关系。那么试试这个呢
于是发现出现了错误
那么 limit 0,1又是什么意思????
LIMIT 0,1,表示从第一个元素即其下标为0开始返回总数为1个的元素,也就是每次查询只会返回一个查询数据。继续撸起袖子,加油思考。
那么既然出错了,那就试试是不是真的存在sql漏洞
果然执行了。看来是真的存在漏洞,这样就可以肆无忌惮的开始利用这漏洞进行查询了。
大体’剥洋葱’思路:字段--数据库名-数据库的表-表中的内容
1.
猜字段用 order by 语句,再用#将后面一个‘注释掉,构造成我们想要的语句
没有将#进行编码
继续试试
发现没有第四个字段,所以字段就是3了
2.
接着查询,union select(联合查询语句) 那三个字段
使用 union select 1,2,3 没有出现想要的数据库名啊,换成database()依旧不行,这是为什么?用函数试一试
其中:
user()返回当前数据库连接使用的用户
database()返回当前数据库连接使用的数据库
version()返回当前数据库的版本
通常会使用concat-ws函数来将这些函数进行组合使用并显示出来。
char()函数为将里面的参数转化为相应的字符,32为空格,58为冒号(:),通过这样的方式可以绕过一些简单的过滤机制。
然而依旧不行,心中跑过一万只草泥马
于是通过搜索这个问题发现是因为在源码中mysql_fetch_array() 函数只能取其中一行来进行输出。所以只能显示这个bumb,后面的语句都没有显示出来。于是乎,嘿嘿嘿嘿,那就让前面的两个查询字段失效就OK了,那么从id上下手让他没有name和password,只有第三个查询字段。
出现了,数据库名就是security
3.
继续查询这个数据库的表格名
使用的group_concat函数一下把所有的表格名写出来,也可以改变limit的值来遍历表格。
于是这个数据库一共有四个表格,我们选择users表来继续
4.
依旧使用group_concat函数来查询,不过这次查询的是users表的列(column)
得到列名以后,就开始可以用列名来得到数据了
5.
继续用group_concat,然而这个结果。。。。有点难以辨认啊
换一种姿势,加上concat_ws
总结:
1.关于注入的关键是找到sql语句的语法
常用查询语句是group_concat和concat_ws
2.单引号的注入是用以闭合之前的查询语句
Less-2 Error Based- 整型数字
首先给出?id=1看看
在测试一下能不能字符型注入
看来是不行的呢,但是看看这个错误信息他是多了一个’(单引号),那么可不可能这个sql语句之中不需要引号呢
来测试一下
查询结果一样,如此看来是和字符没有关系了。
来直接构造注入语句吧
1.字段
2.数据库名
3.该干嘛干嘛
剩下的和第一节步骤一样了。(☆▽☆)
Less-3 Error Based- 带引号的单引号
老样子用?id=1'测试一哈
我们看一下报错的信息(打红圈的地方)是 '1'') ,去掉注入的地方得到的是' '),也就是说比第一节的地方多了个 )
于是大胆推测他的select语句会不会是 (' ') ,俗话说还是要搞一下才知道( •̀ ω •́ )✧
啊哈,和id=1时的结果一样了。决定就是你了,剩下的步骤就和第一节差不多了。
Less-4 Error Based- 双引号
用常用的 id=1' 来试试。
没有问题,那换一下本章所用的双引号来卡看。嗯,果然出现问题了。来看看看后半句 "1"),继续构造语句。
嗯,和第三节相似
bingo!
Less-5 Double Injection-单引号
看到标题顿时一懵,什么是双注入啊,百度一会才晓得是这样的 当一个聚合函数(通常用count()),比如concat函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来 也就是说双注入是要有两个部分来注入,一个使他得到信息,一个使信息显示出来。
根据试了试id来看果然啥都没有
迷之 you are in.........
确定是否有漏洞
还是有的
加个单引号
看来和第一节的出错点是一样的。字段的查询也是OK的。
那么问题来了,如何让我们的查询信息显现出来让我们看到呢。
emmmmmmmm,就用出错信息来看到我们想要的数据库名之类的。如何构造这个报错函数少不了count(),(这是个学习链接,关于为什么这样构造)
group by 作用是分组(这个函数很有用)
rand 的使用是为了报错
于是乎
不过,由于rand的随机性还是要刷新几次才看得到,同理user,和version的得到也是这样的。but,用rand(0)2就一定会出现。
接着查询表
这里本来想用group_concat的来查询的但是弄不出来,技术不够只有手动了
继续学习group_concat的用法,group_concat学习链接之一猜测是因为group_concat是多行查询拼接在一起然后返回的结构,而rand只能返回一个
差列就和之前差不多
一个一个的查询...........感觉小镰刀并不能战胜机械化
数据:
Less-6 Double Injection-双引号
测试?id=1",出错了
嗯,剩下的和第五节的步骤一样了