渗透测试基础-HEAD注入

只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!

在讲解HEAD注入前,得明白一些前提知识:PHP的超全局变量

PHP的超全局变量

在php中的许多预定义变量都是“超全局的”,这意味着他们在一个脚本的全部作用域中都可以使用。

创建的一些超全局变量
$_REQUEST (获取GET/POST/COOKIE) COOKIE在新版本已经无法获取
$_POST (获取POST传参)
$_GET (获取GET传参)
$_COOKIE (获取COOKIE传参)
$_SERVER (包含了诸如头信息(header),路径(path),以及脚本的位置(script locations)等信息的数组)

$_SERVER常用的有
$_SERVER[‘HTTP_REFERER’] 获取Referer请求头数据
$_SERVER[‘HTTP_USER_AGENT’] 获取用户的相关信息,包括用户浏览器,操作系统信息等。
$_SERVER[‘REMOTE_ADDR’] 获取浏览网页的用户ip

介绍这个的意思就是,在某些情况下,网页的提供方是需要获取某些数据来使用的。比如HTTP_USER_AGENT它将获取用户使用的设备,系统,和浏览器型号,方便对其显示的数据做更改,方便给与访问者更好的使用体验。如,我用手机访问这个网页显示的恰到好处,但如果现在我转到电脑上访问这个网站,可是返回给我的网站和手机访问的显示排版一样,页面字体很大,显示区域和手机相同,这样会导致体验很差,因为对端并不知道我现在用的电脑去访问,他还是给我提供的手机界面。

HTTP_USER_AGENT的内容:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.40

在比如[‘REMOTE_ADDR’]获取用户的ip,它的用处可以是,做留痕使用,比如我们在对其一些网站做测试时,网页会提示我们“你的操作有攻击嫌疑,已记录你的ip”,这个ip会被他们保存下来,方便以后的追查(有些是唬人的,有些是真的,比如阿里,腾讯他们,即使没有这些提示,他们也会记录你测试时用的相关信息进去)

既然有这些获取,就说明是需要存写数据进数据库的,这样,我们的注入就有了施展的地方。

HEAD注入靶场演练(一)

在这里插入图片描述
再次来到熟悉的界面,但这次,要多看一点,也是完成HEAD注入的关键:后端代码
在这里插入图片描述
HEAD注入在实际情况中,是较为难发现的,因为不清楚网站会不会获取,获取的是什么,获取的方式有没有增加防护措施。所以实际情况中,更有可能发现HEAD注入的方式,就是对代码进行审记,明确问题点在做测试。

在这里插入图片描述
根据给出的代码可以看出,这里网站获取了HTTP_USER_AGENT,并将获得的数据放入了变量$uagent中,然后数据被插入到了uagent表里的uagent字段当中。这样看来,我们的HEAD注入是能成功的。
这里还要明白一点,一个陌生的网站,如果我们只是对其浏览,不做其他交互,比如登陆什么的功能,那他大概率是不会记录信息你的某些信息的,因为记录这些信息,是需要耗费性能和储存资源。所以我们得先登陆进去,然后在对其进行HEAD注入测试。

先随便输入数据 ➡️ 用Burp抓取数据包 ➡️ 然后对其账号密码爆破(快速截图略过)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
既然登陆成功了,那就开始进行HEAD注入的操作了,还是用Burp抓取已经登陆成功的网站数据包,放入重发模块,看到了User-Agent,注入语句将会在这里执行。
在这里插入图片描述
测试语句:
' or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe

在输入注入语句前,先对其做个简单的学习,了解一下完成HEAD注入的两个关键函数 concat()updatexml()

CONCAT('adm','in')
这个就是一个连接函数,会将括号里的两个值连起来,在这里得到的结果就是 admin

UPDATEXML (XML_document, XPath_string, new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值

还有个关键点,0x7e16进制编码之后的值。我们在将其所有关键点合起来,解释就是:由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样实现了报错注入

在这里插入图片描述
测试语句:
' or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe

这个代码 还有个点,就是末尾的,1)
这个就是网站在其获取数据时,并非只要了一个Uagent,它还要了一个Uname,所以我们得给它补上一个参数,保证语句的完整性。

在这里插入图片描述
将语句贴入进去,网站就返回了当前的库名,我们也接着测试

测试语句:
' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1),1)-- qwe

在这里插入图片描述
得到了flag_head表名,保险起见,将其进行一下16进制转换,这样就可以舍弃数据的单引号(前面的~也是这么个道理,所有用0x7e代替),咱们接着找字段名。

测试语句:
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x666c61675f68656164 limit 1,1)),1),1)-- qwe

在这里插入图片描述

结合得到的 表名 和 字段名。获取最后的flag数据

测试语句:
' or updatexml(1,concat(0x7e,(select flag_h1 from flag_head limit 0,1)),1),1)-- qwe

在这里插入图片描述
这样HEAD注入的第一题就过了,继续看第二题。

HEAD注入靶场演练(二)

有了第一题的铺垫,第二题就会说的简单一点。第二题是获取访问者的ip,但在现实生活中,服务器是获取不到访问者的ip的,中间有分发器这样的东西,服务器获取的是分发器的ip,这时就需要我们自己去添加一个,以达到将数据注入到数据库的操作。服务端想要获取用户的IP,大多采用这样一个通用的IP获取函数 getip()(如下图)

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;
}

这个函数,也是第二题靶场的代码,但用于并没有规定需要传相应数据上去,所有我们这次得自己添加一个X_FORWARDED_FOR上去,在贴上前面的查询语句。

在这里插入图片描述
这样就拿到了flag

漏洞总结

注入攻击的最后的防护方法就是过滤,过滤特殊符号,如’’,"",(),等,既然这样需要获取IP这样的数据,可用正则做一次匹配,这样就能防止用户输入恶意代码语句。

匹配IP正则语句:
^(/d).(/d).(/d).(/d)$

《最好的防御,是明白其怎么实施的攻击》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jinxya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值