PHP eval() 函数

把字符串参数当作 PHP 代码执行

1
mixed eval ( string $code )

参数 $code 是需要被执行的字符串

返回值类型 mixed 是指存在多种不同类型的返回值,默认返回 NULL;如果代码中 return 了一个值,则该值也作为函数的返回值返回;如果代码中出现解析错误,则在 PHP7 之前,返回 FALSE,在 PHP7 之后,抛出 ParseError 异常。

注意事项:

  1. 字符串中代码不要忘记语句末尾的分号;
  2. return 语句会终止当前字符串的执行;
  3. eval() 函数中任何的变量定义或修改,都会在函数结束后被保留;
  4. 若在代码执行过程中产生致命错误,则整个脚本都会终止。

Rule 1:单引号内不解析变量,双引号内解析变量

$x = ‘hello $name’; //单引号内变量不被解析
$y = “hello $name”; //双引号内变量会被解析

hello $name
hello Alice

Rule 2:PHP 字符串中嵌套引号的解析是由外向里的,且只解析一次

即只解析最外层的引号

前端js绕过

1.判断是否存在前端js绕过漏洞:

按F12打开调试面板,选择网络,然后上传图片文件和非图片文件,然后对这两个文件的变化进行对比,如果网络中没有数据变化,说明存在js前端验证漏洞,如果有变化说明不存在。(有变化说明,前端没有做验证,是把文件传输到后台,在后台进行验证的,所以才会有网络请求。)

2.绕过方法一:删除或者禁用js

3.绕过方法二:使用代理上传文件,比如Burp Suite

.htaccess的基本作用

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。

.user.ini

一个可以由用户“自定义”的php.ini

和php.ini不同的是,.user.ini是一个能被动态加载的ini文件。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

00截断

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。

php环境00截断的条件

php版本小于5.3.29

magic_quotes_gpc = Off

content-type绕过

contenent-type

有些上传模块,会对http的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务器是通过ent-type判断类型,content-type在客户端可被修改,则此文件上传也有被绕过的风险.

绕过方式

1.修改脚本后缀,上传,抓包中修改后缀(因为上传的就是图片,所以content-type就是image/png)

2.直接上传脚本,抓包中直接修改conent-type

目录遍历

目录遍历(目录穿越)是一个Web安全漏洞,攻击者可以利用该漏洞读取运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。

在某些情况下,攻击者可能能够在服务器上写入任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。

基础目录遍历

右键打开图片,同时抓包,可以修改filename参数值,利用 ../ 返回上一级来遍历任意文件:

filename=../../../etc/passwd

绝对路径

当过滤 ../ 上一级等关键字,可以直接采用绝对路径:

filename=/etc/passwd

双写../绕过

当防御措施是直接将 ../ 替换为空,可以直接采用双写/复写直接绕过:

filename=....//....//....///etc/passwd

URL编码绕过

可以采用URL编码来绕过服务器对 . 或者 / 的检测:

. => %2e

/ => %2f

% => %25 (双重URL编码)

绝对路径配合../

有些web在获取filename图片文件的时候,会首先判断是否以一个固定的路径开头:

可以配合../来返回上一级遍历任意文件:

filename=/var/www/images/../../../etc/passwd

截断文件后缀

某些web对filename的文件类型作了限制,只有当后缀为图片时才解析

这时候就可以利用 %00 来截断