掌控安全Web安全微专业笔记 (11)

这些超全局变量是:

$_REQUEST (获取GET/POST/COOKIE) COOKIE在新版本已经无法获取了 $_POST (获取POST传参) $_GET (获取GET的传参) $_COOKIE (获取COOKIE的值) $_SERVER (包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组) 常用的: $_SERVER[\'HTTP_REFERER\'] 获取Referer请求头数据 $_SERVER["HTTP_USER_AGENT"] 获取用户相关信息,包括用户浏览器、操作系统等信息。 $_SERVER["REMOTE_ADDR"] 浏览网页的用户ip。

updatexml()

updatexml() 更新xml文档的函数

语法:updatexml(目标xml内容,xml文档路径,更新的内容)

updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了

但是报错的时候他其实已经执行了那个子查询代码!

[0x7e 实际是是16进制,Mysql支持16进制,但是开头得写0x 0x7e是一个特殊符号,然后不符合路径规则报错]

image-20201013225057531

updatexml () 这个函数一般是配合and 或者是or 使用的,他和联合查询不同,不需要在意什么字段数

eg:
select *from news where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)

但是要注意,and 情况下只要一个为False,就会判定是False,所以如果and前面的条件不成立的情况下,就不会执行之后的语句。所以使用的时候建议使用or

某些没有回显盲注也可以用这个updatexml()做出来。

但是报错一般有长度限制,不能输出太长的数据,尽量不要使用group_concat()。

[个人经验:有些盲注也可以试试看报错注入,因为有的时候报错注入的致命错误会显示出来,数据库只忽略普通报错]

X-Forwarded-For

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。[透明代理]

当今多数缓存服务器的用户为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网。有些情况下,这些代理服务器是透明代理,用户甚至不知道自己正在使用代理上网。那么为了获取你的真实IP就要用到X-Forwarded-For了。

边上这段Getip函数是被很多网站和CMS广泛使用的,是属于一个模板,其实就是为了获取你的真实ip,在有代理的情况下,你会发送另外一些请求头来说明你的ip是啥,其中X-Forwarded-For就是其中一种请求头字段。

那么这个getip这里面很明显没有任何过滤,如果被传入的数据被拼接进SQL语句就会发生SQL注入

image-20201013225132467

四、HEAD注入靶场的做法

前1-6题由于对输入的字符串没有安全检查可以直接 \' 方式SQL注入

第7-9题对 ’ 进行过滤,所以只能在请求头中写入注入语句,

image-20201013234939679

$username = $_POST[\'username\']; $password = $_POST[\'password\']; $uagent = $_SERVER[\'HTTP_USER_AGENT\']; $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 uagent (`uagent`,`username`) VALUES (\'$uagent\',\'$uname\')"; $result1 = mysqli_query($conn,$Insql); print_r(mysqli_error($conn)); echo \'成功登录\';

第7题中uagent存入数据库中,把注入语句写到uagent中,就能将我们写的语句执行,由于只有登陆成功才会执行,所有POST里要填正确的账户和密码。由于只有出错,才print_r(mysqli_error($conn));通过此处输出数据库信息。利用updatexml()函数报错。

爆破过程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpdzz.html