UPLOAD_LABS
PASS 1–白名单
-
首先尝试上传正常php文件,提示存在文件后缀名检测
-
查看源码,理解涉及函数
substring():裁剪字符串
lastIndexOf():返回某个子字符串在字符串中最后出现的位置
var ext_name = file.substring(file.lastIndexOf(“.”));的含义为把".“和”."后面的字符串裁剪出来放到ext_name中
stringObject.indexOf( value, index );该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 value。(index:默认时从首字符开始,返回字符串首次出现的位置,没有时返回-1)
白名单支持文件类型:.jpg|.png|.gif
-
burp抓包修改
因为它是在前端进行的JS验证(变量由var定义),因此我们可以通过上传jpg后缀文件,然后在burp中修改文件后缀为php(此处由于是前端JS验证,也可以在相应浏览器中直接禁用JS)
通过蚁剑连接一句话木马
PASS 2–content-type
-
源代码分析
仅验证了文件类型content-type(这里上传方法和pass1一致)
PASS 3–黑名单
-
查看源码,理解涉及函数
array():数组
trim():去掉首尾空格
deldot():删除文件名末尾的点
strrchr():用某一字符去分割字符串,本题为用".“分割文件名获取后缀名,包含”."
strtolower():转为小写
str_irplace():替换,本体为把文件名中的"::$DATA"替换为空
绕过黑名单
黑名单仅仅包含:array(‘.asp’,‘.aspx’,‘.php’,‘.jsp’)
这个黑名单是不全的,我们还可以尝试上传.phtml .phps .php5 .pht的后缀文件(在apache的httpd.conf中有AddType application/x-httpd-php .php .phtml .phps .php5 .pht配置代码),这些也是可以当做php脚本解析的;如果Web服务器是apache的话,也可以上传.htaccess文件,将指定文件后缀名作为php进行解析。
-
实现
成功上传.php5脚本文件,但是却不能用蚁剑进行连接,猜测是没有相应配置无法解析(这里遇到了一个认知错误,我们是使用的nginx服务器,而不是apache服务器,我们并不能解析上述的一些后缀)
此时我们可以利用.user.ini文件进行文件执行,使用注意:上传目录下要有一个正常的php文件,这里为x.php(内容(可以为空):<?php phpinfo();?> 注意在burp抓包分析可知路径为…/upload//x.php),.user.ini文件内容为auto_prepend_file=x.jpg,即在文件前再加一个x.jpg文件(内容:)
在x.php文件的开始处添加一句话木马
访问上传目录下的x.php文件即可执行webshell
PASS 4/9–. .绕过
-
源代码
pass 4–(除了. .绕过,还可利用.htaccess文件将指定后缀名作为.php文件进行解析)
pass 9–(较pass4多过滤了.htaccess)
PASS 5–大小写绕过
-
源代码
PASS 6–“空格绕过”
-
源代码
PASS 7–"."绕过
-
源代码
查看能够发现并没有deldot()删去句尾"."
PASS 8–::$DATA文件流绕过
-
源代码
利用了windows的特性,在window的时候如果文件名+":: D A T A " 会把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。
pass 10–双写绕过
-
源代码
这里出现函数str_ireplace(): 将匹配到的字符替换为空
当匹配当对应字符并删除后,剩余的又重新拼接为php后缀
补充常见的PHP函数
htmlspecialchars()
:将特殊字符转换为HTML实体,防止跨站脚本攻击(XSS)。strip_tags()
:从字符串中去除HTML和PHP标签,以防止XSS攻击。mysqli_real_escape_string()
:对字符串中的特殊字符进行转义,以防止SQL注入攻击。password_hash()
和password_verify()
:用于安全地对密码进行哈希处理和验证,防止密码泄露。filter_var()
和filter_input()
:用于过滤和验证用户输入的数据,例如过滤URL、电子邮件地址或数字。session_start()
:用于启动会话,用户认证和授权通常与会话管理相关联。crypt()
:用于加密和验证密码。openssl_encrypt()
和openssl_decrypt()
:用于加密和解密数据。hash()
:用于生成密码、文件或数据的哈希值,用于确保数据的完整性。setcookie()
:用于设置cookie,并提供安全选项(如设置过期时间、路径、域等)。
move_uploaded_file()
:用于将上传的文件移动到指定位置。漏洞可能出现在未对文件类型做严格验证或未对上传的文件进行适当处理的情况下,可能导致恶意脚本被上传和执行。basename()
:用于获取路径中的文件名部分。可以被滥用来隐藏文件的真实类型和扩展名,例如将 “script.php” 重命名为 “image.jpg”。file_get_contents()
:用于读取文件内容。如果未对访问权限进行适当验证,攻击者可能通过构造特殊的文件路径来读取敏感文件,如配置文件。file_put_contents()
:用于将内容写入文件。如果未对访问权限进行适当验证,攻击者可能通过构造文件路径和恶意内容来写入危险文件,如服务器脚本文件。pathinfo()
:用于获取文件路径的信息。攻击者可以通过构造恶意路径来绕过文件类型检查和上传限制。exec()
或shell_exec()
:用于执行系统命令。如果接收到用户输入并直接传递给这些函数,可能导致命令注入漏洞,攻击者可以执行任意恶意命令。
$_GET
、$_POST
和$_REQUEST
:这些是PHP的预定义变量,用于访问通过 GET、POST 和任意请求方法发送的表单数据。但是要小心处理这些数据,以确保安全性,如使用过滤函数来清理和验证输入。extract()
:这个函数可以将关联数组的键作为变量名,对应的值作为变量值。然而,使用这个函数时要小心,确保不会导致不受信任的变量覆盖已有变量。parse_str()
:这个函数用于解析 URL 查询字符串,并将参数存储为变量。类似于extract()
,在使用它时要小心变量命名和避免不受信任的输入。eval()
:这个函数用于将字符串作为PHP代码执行。但是,eval()
函数的使用容易受到代码注入攻击,因此应尽量避免使用它。unserialize()
:这个函数用于将序列化的数据恢复为原始的PHP对象。然而,反序列化不受信任的数据可能导致代码执行漏洞,因此要谨慎处理。
linux命令
- man-查看命令的帮助,可以按q键退出
文件目录基本操作命令
-
ls-查看当前目录的内容及内容属性
ls -l 列出文件的详细信息
ls -a 列出目录下所有文件,包括以 . 开头的隐藏文件
ls -s 对每个文件名后输出该文件的大小 -
pwd-打印工作目录路径
-
cd-改变当前工作目录
. 当前目录
… 当前目录的上一级目录
/ 根目录
~ 家目录- 上一次所在目录
-
cp-复制/拷贝文件或目录
-
mv-重命名/移动文件或目录,和cp命令操作类似
-
rm-删除目录或文件
-
mkdir-创建目录
-
rmdir-删除目录
-
touch-创建一个空的文件
-
find-文件查找
-
file-显示文件类型
查看文件内容&&内容处理
- cat-查看文件内容
- more-用于分屏显示文件内容,每次只显示一页内容适合于查看内容较多的文本文件(空格和enter键进行操作,less命令相似)
- head-显示文件的头几行
- tail-显示文件的后几行
- diff-以逐行的方式,比较文本文件不一样的地方
- vi/vim-文本编辑器
- grep-查找文件里符合条件的字符串
文件压缩与解压缩
-
tar-用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件
-
zip-用于压缩文件
-
unzip-用于解压文件
-
gzip-用于压缩文件
信息显示
- uname-可显示电脑以及操作系统的相关信息
- hostname-查看当前的主机名
- dmesg-查看开机信息
- uptime-查看时间、负载、运行时间
- stat-查看文件时间类型
- du/df/free-查看空间
- top-用来监控linux的系统状况,比如cpu、内存的使用
- date-显示和设置系统日期和时间
- cal-日历
文件查找和搜索
- find-文件树中查找文件,并做相应的处理
- which-查看可执行文件的位置
用户和用户组管理
- useradd-创建或更新用户信息
- userdel-删除用户
- groupadd-创建一个新的工作组
- id-查看显示目前登陆账户的uid和gid及所属分组及用户名
- passwd-修改用户密码
- su-在一个登陆 session 下切换不同用户(通常是root).意思就是不需要退出当前用户的登录而切换到新用户
- audo-是linux下常用的允许普通用户使用超级用户权限的工具
系统权限及用户授权
- chown-改变某个文件或目录的所有者和所属的组
- chmod-可以控制他人对档案的调用的权限
- chgrp-用于变更文件或目录的所属群组
网络管理命令
- ip-查看所有网卡的接口信息
- ping-测试网络连通性
- route-路由
- telnet-用来远程登录,也可测试端口是否开放
- ssh-远程连接工具
- wget-用来从指定的URL下载文件
- curl-可以模仿浏览器去访问网页请求
- netstat-用来打印Linux中网络系统的状态信息
- ifup/ifdown-开启关闭网卡
- tcpdump-常用域名查询工具
- traceroute-路由跟踪
查看所有网卡的接口信息**
- ping-测试网络连通性
- route-路由
- telnet-用来远程登录,也可测试端口是否开放
- ssh-远程连接工具
- wget-用来从指定的URL下载文件
- curl-可以模仿浏览器去访问网页请求
- netstat-用来打印Linux中网络系统的状态信息
- ifup/ifdown-开启关闭网卡
- tcpdump-常用域名查询工具
- traceroute-路由跟踪