Web渗透测试-寻找SQL注入(1)

   日期:2020-05-07     浏览:116    评论:0    
核心提示:如果看到了一种测试结果,后台便可能执行了对应种类的操作.识别SQL注入漏洞有一种简单的规则:识别WE数据库

Web渗透测试-寻找SQL注入

如果看到了一种测试结果,后台便可能执行了对应种类的操作.

识别SQL注入漏洞有一种简单的规则:

  • 识别WEB应用上所有数据的输入
  • 了解哪种类型的请求会触发异常
  • 检测服务器响应中的异常

一、识别数据输入

Web环境是这样工作的:

  1. 浏览器(客户端)向服务器发送请求并等待响应。
  2. 服务器接受请求,产生响应,将其发送回客户端
    注:双方所使用的协议都为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)
  • 数据和控制结构混合在同一传输通道中

如何防止?

  • 执行严格的用户输入验证和输出编码

三、信息工作流

  1. 用户向web服务器发送i请求
  2. web服务器检索用户数据,创建包含用户输入的sql语句,然后向数据库发送查询。
  3. 数据库执行sql查询并将结果返回给web服务器,数据库不会判断是否为sql注入,只会执行查询语句并将结果返回。
  4. 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'
  1. Web服务器检索用户数据,并创建包含用户输入数据的SQL语句,但是该查询因末尾存在2个单引号导致语法错误
SELECt * FROM users WHERe id='1'' LIMIT 0,1"
  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
  1. Web服务器根据结果创建HTML页面


PS:这段时间快期中考试了,咕了一段时间,第二段过几天放上来。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服