Web渗透测试-寻找SQL注入
如果看到了一种测试结果,后台便可能执行了对应种类的操作.
识别SQL注入漏洞有一种简单的规则:
- 识别WEB应用上所有数据的输入
- 了解哪种类型的请求会触发异常
- 检测服务器响应中的异常
一、识别数据输入
Web环境是这样工作的:
- 浏览器(客户端)向服务器发送请求并等待响应。
- 服务器接受请求,产生响应,将其发送回客户端
注:双方所使用的协议都为HTTP协议,但是请求可能不同
HTTP定义了多种客户端可发送的请求,但SQL注入最相关的请求是:GET请求和POST请求
GET请求
Get是一种请求服务器的HTTP方法。GET请求的信息包含在URL中,在网页中点击一个链接时,一般都为这种方法。GET请求对用户绝对透明。
发送给Web服务器的GET请求一般为这样:
其中:
GET发送的参数为:/link?
后的全部数据(就是指?号后)
请求头 | 解释 |
---|---|
Host: | 请求的主机名或域名 |
User-Agen: | 客户端所运行的浏览器的详细信息 |
Accept: | 指定客户端能接收的内容类型,以及接收的先后顺序 |
Accept-Language: | 指定客户端浏览器显示语言的优先级 |
Accept-Encoding: | 指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。而这里设置的就是客户端浏览器所能够支持的返回压缩格式. |
Refere: | 标识用户从哪个URL发出的当前请求 |
DNT: | do not track禁止追踪,为1是开启,至于服务端是否遵守是另一回事 |
Upgrade-Insecure-Requests: | 对应http头是否为https,如果为1就是告诉服务器自己支持https,请求时就会使用https进行请求 |
Connection: | close表示服务器给客户端发送信息后断开,keep-alive就是保持连接 |
cookie: | 应该都懂,就是cookie值 |
具体详细的请看这位大佬的博客:点击进入
对于GET请求来说,只需要在浏览器的URL导航栏中对URL中?号后的参数做修改,即可操纵这类参数
例如:企鹅的X号购买界面(无漏洞,只做演示)
其中使用了get请求,我们查看下请求
链接为:
https://haoma.qq.com/pay_v2.html?num=22444xxxx&type=10061&month=1&price=0&actid=0&viptype=1&trackid=10001
其中GET参数为:
num=22444xxxx&type=10061&month=1&price=0&actid=0&viptype=1&trackid=10001
如果改变参数:
num=22444xxxx&type=10061&month=0&price=0&actid=0&viptype=1&trackid=10001
该网站就会这样:
POST请求
POST请求与GET请求基本相似,一般在表单(账号注册,登录等)点击Submit按钮提交时使用该方法,与GET不同的是,POST请求将参数分装在HTTP请求头的底部,而不是URL中。
POST请求一般长这样:
画红框的地方为POST请求的数据,因为我用的插件,所以会加粗
插件:火狐浏览器HTTP Header Live
注:数据如何在浏览器中呈现并不重要,有些值可能是表单中的隐藏字段,也可能是下拉选项字段,有些可能会有大小限制或包含禁用字段,这些都只是客户端功能,我们可以完全控制发给服务器的内容,不要将客户端接口机制堪称安全功能。
如果浏览器禁止我修改这些参数该怎么做?
1、浏览器插件进行修改
插件:Hackbar、Web Developer、Temper Data(已下架,但是火狐36.0还有离线包可以使用)
2、本地代理+本地软件
原理:客户端发送的流量包,经过本地代理,被推入本地的相关软件并修改数据包后发送给Web服务器
例如:Paros Proxy、WebScarab、Burp Suite
其他注入型数据
虽然大多数应用都从GET或POST参数中检索数据,但HTTP请求的其他内容也可能会触发SQL注入漏洞
例如:cookie
数据库层面的4种操作:
SELECt:查、根据条件从数据库中读取数据
INSERT:增、将新数据插入到数据库中
UPDATE:改、根据条件更新数据中已有数据
DELETE:删、根据条件删除数据库中已有数据
二、操纵参数
当我们进行post请求或是get请求时,我们可以更改请求参数从而达到目的
- 例如我们在sqli libs靶场中第一关中加入参数?id=1’,数据库将会爆出一个错误,让我们了解该数据库中用来闭合的符号,输入参数?id=3可以查看id为3的用户名和密码
引发SQL注入漏洞的原因
- 缺少用户输入验证
- 缺少用户输入验证,将导致攻击者可以从数据部分(用单引号引起来的字符串或数)跳到注入控制命令(select、union、and、or)
- 数据和控制结构混合在同一传输通道中
如何防止?
- 执行严格的用户输入验证和输出编码
三、信息工作流
- 用户向web服务器发送i请求
- web服务器检索用户数据,创建包含用户输入的sql语句,然后向数据库发送查询。
- 数据库执行sql查询并将结果返回给web服务器,数据库不会判断是否为sql注入,只会执行查询语句并将结果返回。
- web服务器根据数据库响应动态的创建html页面
图中各个角色的作用
1、WEB服务器的作用
- 创建SQL查询语句
- 解析结果
- 将结果显示给用户
2、数据库服务器的作用
- 接受查询
- 返回结果
数据库服务器不会验证是否为sql注入,所以我们可以通过操纵sql语句来让数据库服务器返回任意数据(例如用户的账户和密码),而web服务器也无法验证数据是否合法,因此会将数据返回给攻击者
关于数据库错误
上面说到给参数加一个单引号导致数据库报错。虽然错误显示在了web服务器,但是实际上数据库层也接收到了数据并对其做出了处理
我们看一下sqli libs第一关的源代码
如果我们加入了单引号就变成了
SELECT * FROM users WHERe id='1'' LIMIT 0,1"
图中反应了这条查询语句的处理过程
1.用户发送请求,尝试识别SQL注入漏洞,将发送的值后加入了一个单引号,寻找闭合符号
http://caotang.org/Less-1/?id=1'
- Web服务器检索用户数据,并创建包含用户输入数据的SQL语句,但是该查询因末尾存在2个单引号导致语法错误
SELECt * FROM users WHERe id='1'' LIMIT 0,1"
- 数据库执行SQL语句,发生报错,将报错原因返回给Web服务器
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
- Web服务器根据结果创建HTML页面
PS:这段时间快期中考试了,咕了一段时间,第二段过几天放上来。