upload-labs环境搭建
kali中的docker部署
在kali中进入超级用户
输入
docker search upload-labs
docker pull c0ny/upload-labs
直接拉取c0ny/upload-labs镜像
接着使用
docker images
列出镜像列表,然后直接使用生成一个容器
docker run -d -p 80:80 c0ny1/upload-labs
再使用以下这个命令列出容器列表
docker container ls -a
直接使用来运行容器
docker start <容器ID或容器名>
接着打开这个容器映射的端口即可
这样就成功了一半,环境中文件无法上传(需要创建一个upload文件夹并将此目录下的所有档案与子目录的拥有者皆设为www-data群体的使用者www-data)
找到c0ny1/upload-labs的容器ID,使用时采用前三位395就可以,
docker exec -it e78 /bin/bash
进入upload-labs容器,可以理解为进入操作系统进行操作,/var/www/html 是当前容器内网站的根目录
创建upload文件夹
mkdir upload
文件详细信息可通过查看
ls -l
将权限变更为www-data
chown www-data:www-data upload
完成
phpstudy搭建
首先在传送门中下载upload_labs包,在phpstudy中搭建一个新网站,然后将upload_labs包解压到www的目录下,在新建网站的管理–修改中把路径选为D:\phpstudy_pro\WWW\uploadLabs-main最后直接启动WNMP服务即可。
攻防世界
PHP2
F12没有提示,进一下index.php试还是没有变化,就算有变化可能也是被藏起来了,再试试有没有源代码.phps文件,发现有源代码,接下来就是审计环节了。
在PHP中,文件的扩展名通常是
.php
,而不是.phps
。文件扩展名.phps
通常用于PHP源代码的显示,而不是执行。当你在Web服务器上访问一个.phps
文件时,它会显示PHP代码的源代码,而不会执行它。
- 首先,代码使用
if("admin"===$_GET[id])
来检查是否传递了名为 “id” 的参数,并且该参数的值是否等于 “admin”,如果满足这个条件,它会输出 “not allowed!
” 并终止脚本执行。 - 如果参数 “id” 存在但不等于 “admin”,那么接下来的代码会尝试对 “id” 参数进行URL解码,使用
urldecode($_GET[id])
。 - 然后,它再次检查解码后的 “id” 参数是否等于 “admin”,如果满足条件,它会输出 “
Access granted!
” 和一个密钥(这里用 “xxxxxxx” 代替)。
这段代码检查传递的参数是否为 “admin”,如果是,拒绝访问;否则,允许访问。
当你使用 ?id=admin
作为查询参数访问这个脚本时,因为 $_GET[id]
的值等于 “admin”,所以代码会执行以下操作:
- 首先,代码会进入第一个条件
if("admin"===$_GET[id])
,并检查是否$_GET[id]
的值等于 “admin”,这是为真的。 - 因为条件为真,代码会执行以下操作:
- 输出 “
not allowed!
” - 然后调用
exit()
函数,终止脚本的执行。
- 输出 “
所以,当你传递 ?id=admin
时,脚本会输出 “not allowed!” 并终止执行,不会进入第二个条件,也就不会显示 “Access granted!” 或密钥。
urldecode
是PHP中的一个函数,用于解码经过URL编码的字符串。URL编码通常用于将特殊字符或空格转换成URL安全的格式,以便在URL中传递参数或数据。
urldecode
函数将已编码的字符串还原为原始的非编码字符串。它会将 %
符号后面的十六进制数值转换成对应的字符。
在传入参数时,浏览器会对非ASCII编码进行一次urlencode,结果在代码执行时,相当于id还是admin,所以我们在传参时需要进行两次URL编码
“admin” 的 URL 编码为 %61%64%6D%69%6E
"%61%64%6D%69%6E"的URL编码为 %2561%2564%256D%2569%256E
最终结果如下:
backup
点开后找备份文件,注意:
.bak
:通常用于数据库备份文件,如 SQL Server 数据库备份文件。.zip
、.tar
、.gz
:这些是用于压缩和打包文件和文件夹的文件格式,它们也可以用于备份文件。.old
或.backup
:有时人们会将备份文件保存为原始文件的备份,例如example.txt
的备份文件可以命名为example.txt.old
。.bak1
、.bak2
等:一些人会在备份文件的文件名中添加数字后缀,以区分不同的备份版本。.db
:用于数据库文件备份,如 SQLite 数据库备份。.bakup
:有些人可能使用不常见的拼写变体,如 “bakup”,来表示备份文件。
因此在地址栏加上/index.php.bak
回车
会下载一个文件
答案便是.bak文件中的flag
weak_auth
开始随便输,点击登录
它告诉我们用户名是admin,所以我们使用admin登录
然后它告诉我们密码错误,使用采用burp爆破
打开burp抓此页面
然后发送到intruder
载入一个密码字典进行爆破
结果根据长度排序
发现一个437长度的结果,其对应的密码为123456
simple_php
打开显示
分析以上代码:
show_source(__FILE__);
:这行代码用于显示脚本的源代码。它会将脚本文件本身的内容输出到浏览器,用于调试或学习目的。include("config.php");
:这行代码用于包含名为 “config.php” 的外部文件,通常用于设置和配置脚本所需的参数和变量。- 接下来,脚本通过
$_GET
获取了两个参数$a
和$b
,并将它们分别赋值给$a
和$b
。$_GET
用于获取来自URL查询字符串的参数。 - 脚本接着执行了一系列条件检查:
- 如果
$a
的值等于 0 且不为假(即$a
不是布尔假值),则输出$flag1
。 - 如果
$b
是一个数字(使用is_numeric()
函数进行检查),则脚本退出(不再执行后续代码)。 - 如果
$b
大于 1234,则输出$flag2
。
- 如果
根据这个脚本的逻辑,根据传递给 $a
和 $b
的值,可能会输出 $flag1
或 $flag2
所以,地址后面直接加/?a=abcd &b=4000k
传参即可,结果如下:
baby_web
打开发现只有这个页面,源代码也看不出来,访问index.php时发现他自动跳转回了1.
用burp抓包
对该页面抓包,发送到重发
把1.php改为index.php,发送,发现回复最下面有消息:Flag is hidden
查看16Hex发现
由此可得
网络分析
访问index.php它回跳到了1.php
index.php的状态码为302
HTTP
302 Found
重定向状态码表明请求的资源被暂时的移动到了由该 HTTP 响应的响应头Location
指定的 URL 上。浏览器会重定向到这个 URL,但是搜索引擎不会对该资源的链接进行更新 (In SEO-speak, it is said that the link-juice is not sent to the new URL)。
Location是1.php,
表示网页请求的重定向,
也就是从index.php重定向至1.php去了。
这样也可以得到flag