【Web方向】 1-0 SQL injection梗概

sql注入简介

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

什么是数据库( database() )?

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。

每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。

我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

数据库构造

  • 数据库database(): 数据库是一些关联表的集合。
  • 数据表table: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • row:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • column: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
    莫九玄示例

注入!!!

一,判断注入是否存在

—— 注入的一个大前提就是注入存在,可以用以下几种方法先行判断其存在性

  • and 1=1,and 1=2 返回页面数据不同
  • ?id=3-1,返回数据内容不同
  • 添加“、”“~”以及其他特殊符号报错
  • order by 或group by 查询关联表数目

二,常见的几种注入类型

按照注入点类型来分类

(1)数字型注入点
许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from table_name where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from table_name where id=1 and 1=1

(2)字符型注入点
网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from table_name where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from table_name where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

(3)搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

按照数据提交的方式来分类

(1)GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id是注入点。

(2)POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

(3)Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

(4)HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

按照执行效果来分类

(1)基于布尔的盲注
即可以根据返回页面判断条件真假的注入。

(2)基于时间的盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

(3)基于报错注入
SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。利用xpath语法错误来进行报错注入主要利用extractvalueupdatexml两个函数。

  • extractvalue()
函数原型:extractvalue(xml_document,xpath_string)
-- xml_document是string格式,为xml文档对象的名称
-- xpath_string是xpath格式的字符串
-- 作用:从目标xml中返回包含所查询值的字符串

注入姿势:id=' and (select extractvalue("anything",concat(~,(select语句))))#
xpath_string是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。
extractvalue()能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位

  • updatexml()
函数原型:updatexml(xml_document,xpath_string,new_value)
-- xml_document是string格式,为xml文档对象的名称
-- xpath_string是xpath格式的字符串
-- new_value是string格式,替换查找到的负荷条件的数据
-- 作用:改变文档中符合条件的节点的值

注入姿势:id=' and(select updatexml("anything",concat('~',(select语句())),"anything"))#

案例:extractvalue()和updatexml()报错注入-CTF案例

更多报错注入可参考这篇文章:
https://xz.aliyun.com/t/253

基于数字型注入

(1)联合查询注入
可以使用union的情况下的注入。
基本代码格式为id=' union select "anything",(select 表单1 from 表单2 where 查询条件)#
(表单数量用order by或group by来确定)
案例:union注入-CTF案例

(2)堆查询注入
可以同时执行多条语句的执行时的注入。

(3)宽字节注入

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值