使用checkToken()函数进行校验防止CSRF
函数说明:
null
。checkToken()方法:
函数说明:
\'
转换为 '
等等)。双反斜线(\\
)被转换为单个反斜线(\
)。中间嵌套的if判断是用于检查是否超时,如果 $timenow
的值小于 $timeout
的值,则用户仍然被锁定,因此需要设置 $account_locked
为 true
表示该账号锁定。否则用户可以重新登录。
函数说明:
strtotime(): 将任何英文文本日期时间描述解析为 Unix 时间戳。
time():返回当前的 Unix 时间戳。
函数说明:
在暴力破解的impossible级别中,源代码中使用了Token校验,有效的放防止了CSRF攻击,并且进行了预编译查询数据库,防止了SQL注入漏洞。还添加了用户登录失败次数校验,账户锁定规则校验。
使用checkToken()函数进行校验防止CSRF
函数说明:
null
。.
分成了四个函数说明:
stripslashes():addslashes的反向操作,移除addslashes()函数添加的转义反斜杠字符。返回一个去除转义反斜线后的字符串(\'
转换为 '
等等)。双反斜线(\\
)被转换为单个反斜线(\
)。
explode():explode — 使用一个字符串分割另一个字符串。此函数返回由字符串组成的数组,每个元素都是 string
的一个子串,它们被字符串 separator
作为边界点分割出来。
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
中间嵌套的if用于检测操作系统,以便于执行ping命令
函数说明:
is_numeric():检测变量是否为数字或数字字符串。
stristr():函数搜索字符串在另一字符串中的第一次出现,判断windows NT
是否出现在操作系统的名称描述中。
shell_exec():用于在服务器上执行 shell 命令,并将命令的输出作为字符串返回。如果命令执行错误,将会返回NULL。
php_uname(‘s’):返回运行 PHP 的系统的有关信息。返回了运行 PHP 的操作系统的描述。
php_uname(string $mode = "a"): string
mode是单个字符,用于定义要返回什么信息:
'a'
:此为默认。包含序列 "s n r v m"
里的所有模式。's'
:操作系统名称。例如: FreeBSD
。'n'
:主机名。例如: localhost.example.com
。'r'
:版本名称,例如: 5.1.2-RELEASE
。'v'
:版本信息。操作系统之间有很大的不同。'm'
:机器类型。例如:i386
。在命令注入的impossible级别中,源代码中使用了Token校验,有效的放防止了CSRF攻击。在代码逻辑上对用户输入的ip数据进行过滤,也就是对输入的ip进行按位查看是否规范。从而防止了命令注入漏洞的产生。
函数说明:
null
。函数说明:
null
。在跨站请求伪造的impossible级别中,添加了Token校验,让用户在修改密码的时候都携带返回的token值,有效的防止了攻击者伪造修改密码的请求。
还添加了二次校验,在修改密码的时候,必须先输入旧密码,攻击者无法获取密码,从而使得CSRF漏洞失效。
在文件包含的impossible级别中,在代码的编写上,添加了白名单的限制,防止攻击者使用相对路径来访问服务器上的敏感文件。同时也可以防止攻击者使用HTTP协议来远程包含。
函数说明:
substr():返回字符串的子串
substr(string $string, int $offset, ?int $length = null)
返回字符串 string
由 offset
和 length
参数指定的子字符串。
strrpos():计算指定字符串在目标字符串中最后一次出现的位置。此函数是区分大小写的,与strripos()函数相反,strripos()函数不区分大小写
函数说明:
uniqid():基于以微秒计的当前时间,生成一个唯一ID
ini_get():获取一个配置选项的值。成功是返回配置选项值的字符串,null的值则返回空字符串。如果配置选项不存在,将会返回False。
sys_get_temp_dir():返回用于临时文件的目录,返回 PHP 储存临时文件的默认目录的路径。
这里利用了白名单的方式来判断上传的文件后缀名是否为:jpg,jpeg,png。文件大小是否符合规则,文件类型是否合法,并且通过getimagesize()函数来判断上传的文件是否是图像文件。
中间嵌套的if是通过重新编码图像来删除所有的元数据,根据图片的地址或者URL来生成一个新的JPEG图片或者PNG图片到内存中,并且将内存中的图片以100或者9的画质保存到临时文件中。
imagedestroy()函数最后释放内存中的图片资源。
函数说明:
false
。true
, 或者在失败时返回 false
。false
。true
, 或者在失败时返回 false
。函数说明:
rename():重命名一个文件或目录,可以用于移动文件。成功时返回 true, 或者在失败时返回 false。
getcwd(): 获取当前工作目录。成功则返回当前工作目录,失败返回 false。
file_exists():检查文件或目录是否存在。如果由 filename指定的文件或目录存在则返回 true,否则返回 false。
file_exists(string $filename)
unlink():删除文件
在文件上传漏洞的impossible级别中代码逻辑如下:
中间嵌套的if判断用户检查用户当前输入的密码是否正确,如果正确则更新密码,否则将错误的提示信息反馈给用户。
在不安全的验证码的impossible级别中,采用了checkToken()函数进行校验防止CSRF。并且通过预处理语句查询数据库防止SQL注入攻击。最后采用了二次校验,如果修改密码必须输入旧密码,从而有效的防止了漏洞产生。
函数说明:
is_numeric():检测变量是否为数字或数字字符串。如果 value 是数字或数字字符串, 返回 true,否则返回 false。
intval():获取变量的整数值。
在SQL注入的impossible级别中,所有sql语句的执行使用prepare函数,通过预处理语句查询数据库,防止SQL注入攻击。最后确保sql查询出的结果为1条数据,才返回数据,如果是多条数据则不返回。
在SQL盲注的impossible级别中,所有sql语句的执行使用prepare函数,通过预处理语句查询数据库,防止SQL注入攻击。
sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问权限,无需录直接进入特定用户界面,进而进行其他操作。
函数说明:
在弱会话IDS的impossible级别中,为了防止攻击者获得cookie用户凭证。源代码中采用了随机数+时间戳+固定字符串”Impossible“。进行sha1运算散列值,使得攻击者无法获取到dvwaSession的值。
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
这句代码代码主要用于从当前页面的 URL 中提取指定的参数值。
document.write(" + (lang) + "");
该代码的意思是从 URL 中提取的参数值。将其作为下拉列表项的选项值。
根据观察页面源代码发现在url路径中输入的任何符号,都会被URL编码,在源代码中渲染我们输入的攻击代码的时候,没有进行解码直接以URL编码的方式展示在网页中,所以即使注入了XSS的攻击代码,也无法被客户端执行。
在跨站脚本攻击的impossible级别中,通过url进行XSS攻击代码的注入,攻击代码中的特殊符号会被URL编码,并且以URL编码的方式展示在网页中,所以即使注入了XSS的攻击代码,也无法被客户端执行。
函数说明:
<
替换为 <
,将 >
替换为 >
,将 "
替换为 "
等等。在跨站脚本攻击反射型的impossible级别中,使用checkToken()函数进行校验防止CSRF。并且采用了htmlspecialchars()函数对输入的字符转换为HTML实体。从而有效的防御了反射性XSS攻击。
函数说明:
stripslashes():反引用一个引用字符串。返回一个去除转义反斜线后的字符串(\'
转换为 '
等等)。双反斜线(\\
)被转换为单个反斜线(\
)。
trim():去除字符串两端的空白字符(包括空格、制表符、换行符等)
htmlspecialchars():将输入的特殊字符转换为 HTML 实体。
在跨站脚本攻击存储型的impossible级别中,使用checkToken()函数进行校验防止CSRF。并且采用了htmlspecialchars()函数对输入的字符转换为HTML实体。由于存储型XSS攻击涉及到了数据库操作,为了保证数据库安全,防止SQL注入,对要进行数据库操作语句进行预编译处理。
在代码开始处,通过设置 Content-Security-Policy 头部字段,指定了一个 CSP 设置,即 script-src ‘self’;。这个设置规定只允许从同域名加载 JavaScript 脚本,并且不允许使用内联脚本。
接下来的条件语句检查是否存在名为 include 的 POST 参数。如果存在该参数,将其内容添加到 $page[‘body’] 变量中。
然后创建一个包含说明文本和一个空 元素的表单,表单的提交方法是 POST。
表单中有一个按钮元素,点击该按钮会触发一个事件,调用名为 clickButton() 的 JavaScript 函数。
页面加载了一个名为 source/impossible.js 的 JavaScript 文件,通过 标签引入。
source/impossible.js 中定义了一个名为 clickButton() 的函数。该函数会创建一个新的 元素,并将其 src 属性设置为 source/jsonp_impossible.php,然后将该元素添加到页面的
元素中。
source/impossible.js 中还定义了一个名为 solveSum(obj) 的函数,用于处理异步加载的远程脚本返回的数据。如果返回的数据包含 answer 属性,该函数会将该属性值设置为页面中的 元素的内容。
最后,通过获取按钮元素并添加点击事件监听器,实现了按钮点击后调用 clickButton() 函数的功能。
这段代码使用 Content Security Policy(CSP)限制了 JavaScript 代码的来源和类型,同时对用户输入进行了处理。可以有效地提高了安全性。
永远不能相信来自用户的任何输入,而且必须对此做出防备,但你又不能阻止用户的输入,因为这样可能会干扰网站的正常使用,所以压根就不存在Impossible级别。
靶场中所有的impossible级别的代码,防御措施如下:
都采用了Token校验,使用checkToken()函数进行校验防止CSRF。
在获取用户输入的时候都做了数据消毒,对用户输入的数据进行过滤。
在执行一些特殊操作的时候采用了二次校验的形式,例如在修改密码的时候需要输入旧密码。
对访问服务器资源的时候,做了白名单限制。限制用户访问资源的范围。
上传文件的时候,对文件后缀名,文件类型,文件大小做过滤,上传图像文件的话会创建一个新的图像文件并存储到内容中,有效的防御了图片木马。
在对数据库进行操作的时候sql语句的执行使用prepare函数,通过预处理语句查询数据库,防止SQL注入攻击。
源代码中使用了htmlspecialchars()函数,将输入转为HTML实体,从根源上阻止了XSS攻击。