2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
SQL Inject 漏洞攻击流程
01:注入点探测
自动方式:使用web漏洞扫描工具,自动进行注入点发现
手动方式:手工构造sql inject测试语句进行注入点发现
02:信息收集
通过注入点取期望得到的数据
(1) 环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
(2)数据库信息:数据库名称,数据库表,表字段,字段内容,甚至加密的内容也可能会被破解
03:获取权限
获取操作系统权限:通过数据库执行shell,上传木马
常见的注入点类型
数字型:
user_ id= $id
字符型:
user. id= ‘$id’
搜索型:
text LIKE ‘%{$_ GET[‘search’]}%’"
4x01 数字型注入(post)
- 我们随便选择一个数字并提交,发现url中并没有传参,说明我们的请求是以表单的形式发送。
- 我们可以看到,返回来的数据是由姓名和邮箱两部分组成,我们在Burp里面抓包,如图:
- 我们将此数据包发送至Repeater模块,并在输入点构造payload:1 or 1=1,因为任何id取1=1都为真,所以这样会把所有信息都罗列出来
4x02 字符型注入(get)
- 我们随便输入一段字符,此处以“qwer”为例,发现我们的请求是在url中提交的,,而若我们以vince为例,发现正确返回了数据,而且仍是由姓名和邮箱两部分构成
- 字符型注入,我们猜测sql语句如下:
select 字段1,字段2 from 表名 where username = ‘111’;
后台接收应该是:$uname=$_GET['username']
(其实这部分我看不懂,都是复制粘贴的)
与xss一样,我们要去构造合法闭合,前面的单引号我们也以单引号闭合,后面的单引号我们用#注释掉,所以我们输入的代码为a' or 1=1#
提交后发现所有的数据都列了出来:
4x03 搜索型注入
- 我们尝试输入a进行搜索,发现请在在url里发送,且返回了所有带a的用户
- 由于提示为%%,所以我们猜测
select from 表名 where username like ’ %k% ';
我们依旧是尝试去构造闭合:
我们输入abc%'or 1=1 #
,用%’去与前面的%‘构造闭合,而后面的内容用#注释掉
此时完整语句为:
select from 表名 where username like ’ %abc%'or 1=1 #% ';
输入后发现所有数据都被列出
由此发现,关键在于猜测后台是如何进行拼接的并尝试去构造闭合。
4x04 xx型注入
- 我们进入后端,访问\WWW\pikachu\vul\sqli\sqli_x.php,其中代码如下:
if(isset($_GET[‘submit’]) && $_GET[‘name’]!=null){
//这里没有做任何处理,直接拼到select里面去了
n a m e = name= name=_GET[‘name’];
//这里的变量是字符型,需要考虑闭合
q u e r y = " s e l e c t i d , e m a i l f r o m m e m b e r w h e r e u s e r n a m e = ( ′ query="select id,email from member where username=(' query="selectid,emailfrommemberwhereusername=(′name’)“;
r e s u l t = e x e c u t e ( result=execute( result=execute(link, q u e r y ) ; i f ( m y s q l i _ n u m _ r o w s ( query); if(mysqli\_num\_rows( query);if(mysqli_num