一、PHP伪协议种类与函数PHP支持的伪协议种类file:——访问本地文件系统http:——访问http(s)网站ftp:——访问FTPphp:——访问IO流zlib:——压缩流data:——数据(RFC 2397)glob:——查找匹配的文件路径模式phar:——PHP归档ssh2:——Secure Shell 2rar:——RARogg:——音频流expect:——处理交互流一般用于文件包含的函数:include()require()include_once()require_once()highlight_file()show_source()flie()readfile()file_get_contents()file_put_contents()fopen() (比较常见)二、php://条件:allow_url_fopen:off/on allow_url_include :仅php://input、php://stdin、php://memory、php://temp 需要onphp:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php:/
一、信息收集打开靶场,发现页面源码。if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; } if(!isset($_GET['host'])) { highlight_file(__FILE__); } else { $host = $_GET['host']; echo $host."<br />"; $host = escapeshellarg($host); echo $host."<br />"; $host = escapeshellcmd($host); echo $host."<br />"; $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']); echo 'you ar
一、password=md5($pass,true)绕过这个是只能用于基于MySQL数据库进行的登录判断SQL注入绕过。这个问题的发生是在这个场景下。场景:$pass = md5($_POST['pass'],true); $sql = "SELECT * FROM admin where pass='$pass'"; $result = $conn->query($sql); if ($result->num_rows != 0) { echo "success"; //后续操作 } else { echo "password error or user not found!"; }这个场景看上去很安全是吧?直接将用户提交的密码字符串经过MD5加密后直接拼接在SQL语句中,按照常规思想确实没有办法进行SQL注入,但是这里我们可以构造一个十分巧妙的输入来使where子句永真。md5($pass, true)函数这个函数会返回$pass的MD5原始16字符二进制格式。这也是我们这次绕过的原理。
一、定义PHP中的弱比较运算符,可以实现一些比较奇怪的比较方法,常见于各种CTF题目的绕过中,使用两个等号 == 比较,只比较值,不比较类型。二、字符串与数字php中其中两种比较符号:\=\=:先将字符串类型转化成相同,再比较\=\=\=:先判断两种字符串的类型是否相等,再比较字符串和数字比较使用\=\=时,字符串会先转换为数字类型再比较var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0var_dump('123a' == 123);//true,这里'123a'会被转换为123var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。举例:var_dump('123a1' == 123);//truevar_dump('1233a' == 123);//false<、>、<=、>=都存在和\=\=相同的弱类型,原理相同!!!三、布
定义PHP反序列化可以将一个对象转换为一个字符串保存起来,这将导致类中的成员可被用户控制,同时PHP在反序列化时会触发一些魔术函数,若这些魔术函数中含有危险函数且危险函数的参数是类的成员变量,即可导致越权访问或者命令执行。主要涉及到两个函数:serialize($o):将对象序列化为字符串unserialize($str):将字符串反序列化为对象序列化字符串解析PHP序列化对象只会序列化对象的成员变量,对三个类型的成员变量有不同的标志方法。例:class Obj { public $int = 2; protected $str = "2"; private $a = "a"; } $o = new Obj(); echo serialize($o);O:3:"Obj":3:{s:3:"int";i:2;s:6:"%00*%00str";s:1:"2";s:6:"%00Obj%00a";s:1:"a"
Equinox
一个乐于分享的网安人