该文章内容为本人个人学习中的记录和理解,部分内容可能有些出入,但值得新手一读并结合互联网搜索理解和学习更多的知识。本人恳切的希望各位读者能从本文章中有所收获,并希望各位读到纰漏之处不吝赐教,非常地感谢。

CTF中WEB 类的题目包括但不限于:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、PHP 常见漏洞、代码审计等。

弱类型问题

在PHP中:

==   会先将两遍的数据进行类型转换再比较;

===   会先判断类型是否相等再比较数据是否相等

两个等号( == )数据转换的规则是:

数字和字符串比较:先将字符串转化成数字,从字符串的第一个位字符开始,如果不是数字,则该字符串转换为数字0;如果是数字,一直往下数到最近的不是数字的字符为止。

举例如下:

  • "admin" == 0
  • "admin123" == 0
  • "123admin" == 123
  • "123ad111" == 123
  • "0e123456" == "0e999999"
  • 只有0e后面全为数字的两个字符串才会相等,如果是 0e123abc0e111abc0e123456 则互不相等,但都和数字0 弱相等,即:
  • 0e123abc != 0e111abc != 0e123456
  • 0e123abc == 0 0e111abc == 0 0e123456 == 0

当字符串作为数字取值时,包含“.”、“e”、“E”(科学计数法)的字符串会被认为是float类型,其他情况都视为int类型,举例如下:

  • 1+"10.5"== 11.5(float)
  • 1+"-1.1e1" == -10(float)
  • 1+"123ad111" == 124
MD5的弱相等

方法1、PHP处理0e开头的md5哈希值时的缺陷问题,两个0e开头的哈希值在比较时都被认定为数字0,如下:

$a != $b;
md5($a)  ==  md5($b)
//部分0e开头的MD5哈希值:
//7197546197 :0e915188576072469101457315675502
//ABJIHVY    : 0e755264355178451322893275696586
    
$a == md5($a)
// 以0e开头,其md5值也是以0e开头的值:0e215962017 :0e291242476940776845150308577824

方法2、以数组的形式将数据转化为MD5哈希值,会返回NULL

md5(array($a)) //返回值为 NULL
md5(array($b)) //返回值为 NULL
md5(array($a))  ===  md5(array($b))  // 强相等

强相等的md5:

$id[]=123;
$gg[]=456;
var_dump($id===$gg);	// false
var_dump(md5($id)===md5($gg))	// true

RCE(远程命令执行漏洞)

RCE(remote command/code execute)远程命令执行漏洞

在操作系统上执行任意命令

如php中的 style()、exec()、shell_exec()等函数方法

$ip = 127.0.0.1;ls -l;	// 中间的分号可以隔开两次命令,两次命令都会执行
// cmd1;cmd2 执行cmd1后,执行cmd2
// cmd1&&cmd2 cmd1执行成功后才会执行cmd2
// cmd1||cmd2 cmd1执行失败后才会执行cmd2
// cmd1|cmd2  cmd1命令的结果作为cmd2命令的参数,执行获得cmd1参数后的cmd2
// %0a  %0d  换行符
system("ping -c 4".$ip)

字符过滤问题:

空格绕过使用: ${IFS}、${IFS}$、$IFS$9、重定向符<>和<、%20、%90

绕过

base64绕过:echo [xxx]|base64 -d|base echo [xxx]|base64 -d|sh

定义变量作拼接:a=fl;b=ag;cat $a$b.php

内联执行:cat $(ls|grep flag.php) // 本质是先执行$()内的命令再执行外面的命令,也可以将$()换成反引号引起来

无字母数字RCE

php段标签 : <?<?php 等同

<?= 等同 echo

<?=$(/???/???%20*); 可以表示:输入/bin/cat *

文件有关漏洞

文件包含
  • 文件包含漏洞:文件被解析
  • 文件读取漏洞:显示文件源代码
  • 文件下载漏洞:提示文件下载,有下载功能的地方都有可能又下载漏洞
文件上传

规定了文件上传的类型,可能是

  • 前端JS过滤:关闭JS、burpsuite改文件名
  • 后端代码过滤:尝试使用其他文件名、muma注入
文件备份

备份文件一般都是.bak或者.swp,一般备份文件在/index.php.bak

扫描工具有 dirsearch、御剑