fileinclude
首先它的报错信息暴露了它的文件路径。这对后边的payload的构造很有帮助。
没有其他信息查找路径,查看一下源代码
发现了这是代码审计的题。
利用bp抓包加Cookie
又看到include()函数,可以利用php://filter伪协议绕过
因为后边有了.php所以不用加.php
最后得到flag
Web_php_unserialize
显然这是一个代码审计的题
它提示我们关键信息在fl4g.php这个文件下
看到魔法函数构造函数,在序列化时会执行,关键会将$file变量文件源代码显示出来
补充知识:highlight_file("index.php");
是一个 PHP 函数,用于在浏览器中高亮显示指定文件的源代码。在这个例子中,它会将名为 index.php
的文件的源代码以一种易读的方式显示在浏览器中,以便开发人员查看和理解代码的结构和逻辑。
接着我们通过phpstrom将序列化后的对象输出
因为他对传入的数据有一个base64解码的操作,我们再对其进行加密构造payload
、
结果发现不对啊
因为这里有一个过滤(通过正则表达式)
补充知识:preg_match
函数用于在字符串中进行正则表达式匹配,如果匹配成功则返回1,否则返回0。
我们可以在前面加上+绕过(在php中会被认成正号,所以无影响)
发现页面没变
发现这个魔法函数会把我们修改后的file给改回来,所以要进行绕过
构造之后发现不对,没有绕过_wakeup()函数
_wakeup()魔术方法在执行unserialize()时,会优先调用这个函数,而不会执行_construct()函数,绕过方法:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过_wakeup的执行
补充知识:private声明的字段为私有字段,只在所声明的类中可见,因此私有字段的字段名在序列化时,字段名前面会加上\0\0的前缀,字段名被作为字符串序列化时,字符串长度也包括根据其可见性所加的前缀。字符串长度也包括所加前缀的长度
public:属性被序列化的时候属性值会变成 属性名
protected:属性被序列化的时候属性值会变成 \0*\0属性名
private:属性被序列化的时候属性值会变成 \0类名\0属性名
\0时ascll码表为0的字符NULL
这就导致输出的结果会比我们看到的字符少两位吗,因此我们在构造payload的时候不要先输出再编码,可以利用str_replace()函数实现前期的绕过,然后直接编码得到payload
supersql
很标准的sql注入靶场页面
提交一下,发现url参数为inject,同时有回显,我们考虑一下是否为联合注入,
结果还是真,推测应该不是数字类型。
所以我们尝试用’ ” )这些简单的组合尝试注入
按普通方法先查字段名然后联合搜索,回显得到信息
结果发现
构造的语句都被则掉了。
那我们就尝试一下堆叠注入。
发现注入成功。
那我们就分别查询一下两个表的字段名,看能得到什么有效信息
words表里的字段名为id与data,我们很容易联想到这就代表着输入框,和回显内容
数字表里的字段名为flag,显然我们要找的flag就在这里。
因为回显的是words表里的内容,而且正则表达式没有对rename 和alter 进行限制
所以我们给他们替换一下(这段代码的含义是将数据库中的表名words
改名为words1
,然后将表名为1919810931114514
的表改名为words
,最后修改words
表中的列名flag
为id
,并将其数据类型改为varchar(100)
。)
最后我们只需要加or 1=1绕过就可以得到flag里的信息了。