南邮CTF——WEB Write Up

南邮CTF——WEB Write Up

md5 collision——md5弱类型

题目:md5 collision

<?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=1023id =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/76549761
http://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 通过这句话: s q l = " s e l e c t u s e r f r o m c t f w h e r e ( u s e r = ′ " . sql="select user from ctf where (user='". sql="selectuserfromctfwhere(user=".user."’) and (pw=’". p a s s . " ′ ) " ; 可 以 发 现 闭 合 符 号 为 ’ ) 通 过 这 句 话 : i f ( pass."')";可以发现闭合符号为’)通过这句话: if( pass.")";if(query[user]==“admin”) { echo "

Logged in! flag:********************

";可以发现题目需要用户名为admin因此在username处输入admin’)#

pass check —— 数组

题目:$pass=@$_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:反斜杠可以用来转义 仔细查看相关函数的用法网页源代码:

 <!--#GOAL: login as admin,then get the flag;error_reporting(0);require 'db.inc.php'; 
 function clean($str){ 
    if(get_magic_quotes_gpc()){ 
           $str=stripslashes($str);
               }    
               return htmlentities($str, ENT_QUOTES);}
               $username = @clean((string)$_GET['username']);
               $password = @clean((string)$_GET['password']);
               $query='SELECT * FROM users 
               	WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
               	$result=mysql_query($query);
               	if(!$result || mysql_num_rows($result) < 1){    
               		die('Invalid password!');}
               		echo $flag;
               		-->Invalid password!

注意上面clean function中的htmlentities()函数,它会把输入字符中的 ’ 或者 ” 转变为html实体,这样一来就无法闭合源代码中的 ’ 了,还有就是,如果php的magic_quotes_gpc是开启状态的话,我们输入的转义符也会被去掉的,不过既然这道题目能做,说明我们是可以使用转义符 \ ,我们解这道题的关键就是使用转义符 \ 来让源代码中 'SELECT * FROM users WHERE name=\''.$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

  if($_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 "<p>Logged in! Key: ntcf{**************} </p>"; 
               }  else { 
                  echo("<p>Log in failure!</p>");  }}
                  ?>```

在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给 s q l , 这 样 在 查 询 的 时 候 sql,这样在查询的时候 sqlquery就会有值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

打开网页
观察了一些源代码,果然找到了管理员邮箱admin@nuptzj.cn
看下一个提示非正常关闭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='$token' AND email='$emailAddress'";  
  $r = mysql_query($sql) or die('db error');  
  $r = mysql_fetch_assoc($r); 
  $r = $r['num'];  
  if($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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值