题目是一个文件web100,没有后缀,加上.php后缀后打开发现是乱码的
把文件放在www根目录下,然后访问,发现有一个输入框
查看网页源代码,发现也是乱码的
eval()函数会把字符串当做php代码执行,eval(_)
会把这个函数的代码输出来,我们把eval改成alert,把代码用弹出来。
把源码复制下来然后粘贴到记事本中整理一下
0
简单的审计一下,这段代码的意思是这个e要满足所有的 if 条件才能输出flag
所以输出flag有两个方法:
1、满足正则表达式
/^表示匹配开头,所以开头要匹配到 be0f23 ,$/表示匹配结尾,所以结尾要匹配到 e98aa ,总共的长度要满足 length==16,按照规则组合一下得到 be0f233ac7be98aa
发现长度刚刚好是16,然后在输入框中输入就会输出flag
2、我们的目的是要绕过匹配正则表达式的if语句,其实我们可以直接把要执行的那几行代码放到控制台执行,这样也可以。
serialize(),序列化函数,会把类序列成字符串
unserialize(),反序列化函数,把序列化的字符串反序列化成类
题目中的__wakeup()是一个魔法函数,它会在unserialize()函数执行时触发,__wakeup()函数触发时会结束整个程序,同时输出“bad requests”。
?code=提示我们以get形式传递code的值
既然给了我们类,又提示了我们传参的方式,很明显这是要我们先把类序列化一下,然后再作为code的值传进去。
先将上面的类用serialize()函数序列化一下:
由于序列化时类中的方法不会被序列化,所以序列化时类中的方法可以省略不写
先试试直接将序列化的结果传入会怎么样:
果然跟预料中的一样,直接传入会调用__wakeup()
函数提前结束程序,这时我们就要绕过__wakeup()
函数,不让它触发。
然后去百度了一波,发现如果我们将数值个数 1 改成大于 1 的任何数字,在反序列化时就不会调用 __wakeup 函数。
然后输入url?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
总的来说这道题还是比较基础的,主要考了反序列化和如何绕过__wakeup()魔法函数的知识,如果掌握这些,这道题就很好做。
题目描述说其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统,那我们就直接进入设备维护中心,光看界面看不出什么,也没有什么可以点的,查看网页源码可以获取一点信息。
然后在url后面加上?page=“index”,界面就会输出index,几次尝试之后发现page的值是多少,界面就会输出多少。
其实到这我就没有思路了,后来听大佬说要使用php伪协议查看源码才知道该怎么做。
伪协议php://filter/read=convert.base64-encode/resource=xxx.php
可以查看xxx.php的源码,源码被base64加密。
更多伪协议请参考:https://blog.csdn.net/nzjdsds/article/details/82461043
我们输入url?page=php://filter/read=convert.base64-encode/resource=index.php
就可以看到index.php的源码了
base64解密之后得到真正的源码,在源码里面有一部分php代码,这才是解题的关键。
通过简单的代码审计可知,在满足x-forwarded-for的值为127.0.0.1时,向该网页传入三个参数,最后利用preg_replace()函数进行任意代码执行。
当preg_replace()函数中存在/e模式修正符时允许任意代码执行。
flag一般在某个文件夹下的某个文件里,所以我们先通过命令查找一下flag的位置,将url设置成?pat=/test/e&rep=system('find / -iname flag')&sub=test
,然后抓包修改,把x-forwaeded-for: 127.0.0.1添加在请求头中。
然后得到flag文件的路径
之后进入这个路径查看一下里面的文件,将url设置成?pat=/test/e&rep=system('cd /var/www/html/s3chahahaDir/flag && ls')&sub=test
(&&是命令连接符,它的作用是先执行前面的命令,前面的命令执行成功后再执行后面的命令)再次抓包修改,这次不仅需要添加x-forwaeded-for: 127.0.0.1 ,还要把&&进行url编码,不然浏览器无法识别该符号。
发现flag目录下有一个flag.php,然后用cat命令查看该文件,将rul设置成?pat=/test/e&rep=system('cat /var/www/html/s3chahahaDir/flag/flag.php')&sub=test
,抓包修改,添加x-forwarded-for: 127.0.0.1到请求头,然后发包,最后在网页源代码中找到flag
总结一下,这道题主要考了php://filter伪协议,preg_replace()函数的任意代码执行和代码审计的知识,在这其中php伪协议比较陌生,今天还是头一次听说,以后还需要多了解了解。
进入这道题很容易就会发现url中通过get方式传入的page参数,在不同的页面,page的值就不同。
那当我们令page的值为flag时,会不会出现flag呢?
额,果然没有这么简单,目前能直接得到的信息很少,我们用dirsearch扫描一下,看看能不能找到其他的页面。
用dirsearch扫一下发现存在.git源码泄露,然后用GitHack把源码下载下来。
源码中确实有一个flag.php文件,但里面没有什么内容
但在index.php里发现了不少信息
通过简单的审计发现我们传入的参数可以被assert()函数当成代码来执行
assert() 检查一个断言是否为 FALSE
strpos() 函数查找字符串在另一字符串中第一次出现的位置。如果没有找到则返回False
构造payload:
?page=abc') or system("cat templates/flag.php");//
strpos()函数被提前闭合,里面只传入了abc,所以肯定返回false,但or后面的system里面的内容肯定会被执行,最后再注释掉后面的内容
这样就可以查看flag.php的内容了