当初自己也不知道写这个干什么,干劲十足吧,既然写了就发出来继续更新吧。

image_1cee71otlos41qp4gq6j651r979.png-218.7kB

不显示错误信息:error_reporting(0)

文件包含函数:include()、include_once()、require()、require_once()

开启session:session_start()

是否开启了gpc功能:if( !get_magic_quotes_gpc() ){}

过滤函数:addslashes()入敏感的内容会被转义(\)


strtoupper()用法:

将内容转成大写


等号用处分类:

1
1、=:赋值,在逻辑运算时也有效;
2
3
2、==:等于运算,但是不比较值的类型;
4
5
3、===:完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真。

strpos()用法:

image_1cml2asu81dbc113tjcv1u641lvv9.png-23.2kB


call_user_func()用法:

image_1cmmfs7ek14eupqrspq1ge9mghp.png-9.4kB

如果我们传递?a=assert&b=phpinfo()就会执行phpinfo函数,如图

image_1cmmft0fpri5gt1cs4jaj1uel16.png-108.3kB


readfile()用法:

定义和用法

readfile() 函数输出一个文件。
该函数读入一个文件并写入到输出缓冲。
若成功,则返回从文件中读入的内容与字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。

readfile( filename,include_path,context )

参数 描述
filename 必需。规定要读取的文件。
include_path 可选。如果也想在include_path中搜索文件,可以使用该参数并将其设为 true。
context 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。
1
echo readfile( 'cai_team.txt' );

image_1cf5k429h93b1t2dls83t6db919.png-42.2kB


define用法:

1
<?php
2
define("GREETING","Hello world!");
3
4
var_dump( defined("GREETING") ); //如果存在返回True
5
var_dump( defined("only_free") );
6
?>

输出:

image_1cjgnhepi1qip65erps107v134p9.png-44.4kB


chdir用法:

image_1cdp74hqt1rgd9ln1rgv736man9.png-28.3kB


mkdir用法:

1
<?php
2
    mkdir('1.iamfree') //会在当前目录下创建一个1.iamfree文件夹
3
?>

const用法:

1
<?php
2
    const name='iamfree';
3
    echo name;
4
5
/*
6
输出:iamfree
7
*/
8
?>

htmlspecialchars()函数:
image_1cavlibuatcrb7u1qbv6ni1p9.png-17.3kB

执行转换:

字符 替换后
& (& 符号) &amp;
“ (双引号) &quot;,除非设置了 ENT_NOQUOTES
‘ (单引号) 设置了 ENT_QUOTES 后, ' (如果是 ENT_HTML401) ,或者 ' (如果是 ENT_XML1、ENT_XHTML 或 ENT_HTML5)。
< (小于) &lt
> (大于) &gt

extract()函数:
image_1cb2cblp6lpb19ku1ouu4d81h701t.png-32.2kB


parse_str():

1
 <?php
2
3
    parse_str('name=iamfree'); //把name变成变量名,iamfree变成变量值
4
    echo $name;//输出iamfree
5
6
?>

import_request_variables():

此函数把GET、POST、COOKIE的参数注册为变量,一般不建议开启

注意,只在 PHP4.1PHP5.4之间可用

1
<?php
2
3
    $name = 'whoami';
4
    import_request_variables('GP'); //G表示GET、P表示POST如果有C表示COOKIE;这里的GP表示注册GET和POST请求的参数为变量
5
    echo $name;
6
7
?>

效果:
image_1cckvkb6b186c6g11p8ojf4lbd9.png-54.1kB


array_key_exists():

1
array_key_exists ( $key , $array )

数组里有键 key 时,array_key_exists() 返回 TRUE。 key 可以是任何能作为数组索引的值。

image_1cba1lh3okkkg0n1qkp1uuc104v9.png-16.1kB


str_ireplace过滤sql语句:
str_ireplace.png-816.7kB
此函数用法:
str_ireplace用法.png-6.4kB
将 whoami? 中的 whoami 被 iamfree 替换,也就是说把whoami?里的whoami替换成iamfree所以结果就是iamfree?

这里其实是可以绕过的,比如:
image_1caugtd8fj54ke9tf112cr1qbl4h.png-150.2kB


运算符:
名称 | 关系 | 示例 | 结果
:-:|:-:|:-:
and | 与 | $x and $y |如果 $x$y 都为 true,则返回 true。 |
or | 或 | $x or $y | 如果 $x$y 至少有一个为 true,则返回 true。
xor | 异或 | $x xor $y | 如果 $x$y 有且仅有一个为 true,则返回 true。
&& | 与 | $x && $y | 如果 $x$y 都为 true,则返回 true。
|| | 或 | $x ||$y | 如果 $x$y 至少有一个为 true,则返回 true。
! | 非 | !$x| 如果 $x 不为 true,则返回 true。


变量覆盖:
image_1cbrhvola1igmjhm15mc1rsqed816.png-33.4kB
image_1cbri0lsa1tuc1erh1d5q1drsdre1j.png-70.7kB

难一点的:

1
<?php 
2
    foreach (array( '_GET','_POST' ) as $key => $value) {
3
        foreach ($$value as $_key => $_value){
4
            echo $_key.':'.$_value;
5
            echo "<br >";
6
        }
7
    }
8
?>

执行后的结果:
image_1ccl9ivq22vk1pdat631f7oq8s1g.png-32.5kB


define()用法:

1
<?php 
2
    define('t',time()); //把time()的返回值定义为常量(t)    
3
    echo t;
4
?>

image_1ccl95vnr10rv1el118e91bdl155m13.png-73.9kB

三元表达式:

1
<?php
2
3
    $name = !empty($_GET['name']) ? $_GET['name'] : '此人无名'; //表示如果$_GET['name']不为空的话就返回$_GET['name']如果为空就返回 此人无名。
4
    echo $name;
5
6
?>

还可以有一种判断方法:

1
<?php 
2
    echo 1;
3
    isset($_GET['name']) && exit('exit'); //如果isset($_GET['name'])为真也就是name这个参数存在的时候,会执行exit('exit'),相反,不存在的时候不会执行exit('exit')   
4
    echo 2;
5
?>

name参数不存在时:
image_1ccl8dgoon1s7l1i4d2bh2449.png-46.7kB

name参数存在时:
image_1ccl8eog3koq1oa41g4210elf3sm.png-68.8kB


nl2br()函数:
image_1cbrhga1o1i0t1vnl2611jojbkip.png-22.5kB


eval()函数:

1
代码
2
<?php
3
$string = 'cup';
4
$name = 'coffee';
5
$str = 'This is a $string with my $name in it.';
6
echo $str. "\n";
7
eval("\$str = \"$str\";");
8
echo $str. "\n";
9
?>

输出:
This is a $string with my $name in it.
This is a cup with my coffee in it.


explode()函数:

也就是拆分

image_1ca61lt671266hda1loq1om3gr411.png-28.6kB


copy()函数:

copy(source,destination)
参数 | 描述
:-: | :-:
source | 必需。规定要复制的文件。
destination | 必需。规定复制文件的目的地。

将文件从 source 拷贝到 destination。如果成功则返回 TRUE,否则返回 FALSE。


trim()函数:
移除字符串两侧的空格等特殊字符
移除字符串两侧的空格等特殊字符.png-14.7kB


strcasecmp()函数:
image_1calh2fsf1pjn50b1nh11h0v1v3d9.png-39.5kB


正则表达式:

preg_match()函数:
preg_match函数的参数介绍

匹配一下i
image_1cb2e316g1k9mdevmb11v3v15sm2a.png-16.9kB

这里的//是定界符 ,之需要二处字符一样就可以,比如== -- ?? 等等 但是有些不能做定位符 比如a到z、A到Z、0到9、空格、\

匹配全部英文字母(包括大写):
image_1cb2e8ben2u160k1kuktn1n792n.png-33kB

替换匹配到的内容:
image_1cb2ej8kv1l2loph4hd2480l3h.png-20kB


define()函数:
image_1cau24b5jgimn6h6ge7sd8u19.png-19.7kB

1
define(name,value,case_insensitive)
参数 描叙
name 必需。规定常量的名称。
value 必需。规定常量的值。
case_insensitive 可选。规定常量的名称是否对大小写敏感。
若设置为 true,则对变量名大小写不敏感。默认是 false(大小写敏感)。

dirname()函数:
image_1cau2i80e2ag1rp5a721pak1ku4m.png-39.5kB
dirname(path)

参数 描述
path 必需。规定要检查的路径。

该函数返回去掉文件名后的目录名


iconv()函数:
image_1cau44qdgb61h0u119k11ok1rda1g.png-60.5kB
iconv ( in_charset , out_charset , str )
将字符串 str 从 in_charset 转换编码到 out_charset。

intval()函数:
image_1calj80va17dali6obj1bsj1371n.png-70.2kB
还可以当防止SQL注入:
image_1cartbh4v1thh1egn1iga1fcinu1g.png-14.6kB


reset()函数:
image_1camn387gtjs1pj6imq18fmoap.png-57.2kB


$$变量覆盖:
image_1campm57rug6ul5e76u4h1ij216.png-36.5kB

还有一个很有趣的:

1
<?php
2
3
    $g = '_GET';
4
    $g = $$g; //这个时候$$g的第二个$与$g的值拼接了变成了$_GET,第一个$变成了$g,所以$g=$_GET
5
    echo $g['name'];
6
    
7
?>

image_1cckvtnv0fkgv9volmk581ue5m.png-62.9kB


isset()函数:检测变量是否已设置并且非 NULL
unset()函数:释放给定的变量


parse_ini_file() 解析一个配置文件。

1
array parse_ini_file ( string $filename [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL ]] )

载入一个由 filename 指定的 ini 文件,并将其中的设置作为一个联合数组返回。

参数 用法
filename 要解析的 ini 文件的文件名。
process_sections 如果将最后的 process_sections 参数设为 TRUE,将得到一个多维数组,包括了配置文件中每一节的名称和设置。process_sections 的默认值是 FALSE。
scanner_mode Can either be INI_SCANNER_NORMAL (default) or INI_SCANNER_RAW. If INI_SCANNER_RAW is supplied, then option values will not be parsed.

返回值: 成功时以关联数组 array 返回设置,失败时返回 FALSE。


urldecode()函数,可能会造成urldecode二次注入:
image_1cao633k6105ecv99s4pre14129.png-32.1kB


$_FILES用法:
image_1cb241vvp1ls511el1umg44v1oqi9.png-42.7kB

image_1cb242979174ttbvod71k31e97m.png-43.3kB

image_1cb2494dpm70155kdea1i1217um13.png-117.7kB


is_numeric()函数:

判断是否为数字,是返回1,不是返回空

image_1cao6u6q0cd76121e244i910gm.png-24.7kB


dvwa的sql注入的impossible等级源码(dvwa的impossible不存在sql注入):
image_1cao7j7051cek133f1oku1ek51vc13.png-47.7kB
当然 我看不懂这几行:

1
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
2
$data->bindParam( ':id', $id, PDO::PARAM_INT );

substr()函数:

1
<?php
2
$rest = substr("abcdef", -1);    // 返回 "f"
3
$rest = substr("abcdef", -2);    // 返回 "ef"
4
$rest = substr("abcdef", -3, 1); // 返回 "d"
5
6
$rest = substr("abcdef", 0, -1);  // 返回 "abcde"
7
$rest = substr("abcdef", 2, -1);  // 返回 "cde"
8
$rest = substr("abcdef", 4, -4);  // 返回 ""
9
$rest = substr("abcdef", -3, -1); // 返回 "de"
10
?>

strrpos()函数:

1
<?php
2
$foo = "0123456789a123456789b123456789c";
3
4
var_dump(strrpos($foo, '7', -5));  // 从尾部第 5 个位置开始查找
5
                                   // 结果: int(17)
6
7
var_dump(strrpos($foo, '7', 20));  // 从第 20 个位置开始查找
8
                                   // 结果: int(27)
9
10
var_dump(strrpos($foo, '7', 28));  // 结果: bool(false)
11
?>

extract()函数:
image_1capb8b1l16th19ectna124m6sp9.png-46.6kB


常见语法:

1
if(empty($a)) $a = 'hello world'; //如果$a为空,那么它的值为hello world
1
$s = 'sys'.'tem';
2
$s('whoami'); //返回desktop-a0iqkh2\iamfree
3
/*这里就是执行了whoami的命令*/

匿名函数:

1
$C_F = create_function('$name','return $name;'); //$name的位置是传递什么参数,第二个参数是函数里执行什么代码
2
echo $C_F('iamfree'); //输出iamfree

回调函数:

1
function Func($name){
2
    echo "hello $name";
3
}
4
call_user_func('Func','iamfree'); 
5
/*输出:hello iamfree*/
1
call_user_func('system','whoami');
2
/*输出:desktop-a0iqkh2\iamfree*/

命令执行函数:

  • exec() — 执行一个外部程序
  • passthru() — 执行外部程序并且显示原始输出
  • proc_open() — 执行一个命令,并且打开用来输入/输出的文件指针。
  • shell_exec() & `` — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
  • system() — 执行外部程序,并且显示输出
  • popen() — 通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。

image_1carr8bt51nu8inj1ovq1b3nai79.png-42.6kB


文件操作函数:

  • copy — 拷贝文件
  • file_get_contents — 将整个文件读入一个字符串
  • file_put_contents — 将一个字符串写入文件
  • file — 把整个文件读入一个数组中
  • fopen — 打开文件或者 URL
  • move_uploaded_file — 将上传的文件移动到新位置
  • readfile — 输出文件
  • rename — 重命名一个文件或目录
  • rmdir — 删除目录
  • unlink & delete — 删除文件

任意文件读取、写入、删除往往是上面几个函数受到了控制(当然还有其他的函数)。
不同的函数在不同的场景有不同的作用和不同的利用手法。
读取:可以读取配置等文件,拿到key
写入:可以写入shell代码相关的内容
删除:可以删除.lock文件而可以重新安装覆盖

image_1carrl00k1f4isqn1kthuu9o4rm.png-389.2kB


特殊函数

信息泄漏

bool phpinfo ([ int $what = INFO_ALL ] )
输出 PHP 当前状态的大量信息,包含了PHP编译选项、启用的扩展、PHP版本、服务器信息和环境变量(如果编译为一个模块的话)、PHP环境变量、操作系统版本信息、path变量、配置选项的本地值和主值、HTTP头和PHP授权信息(License)。

软连接-读取文件内容

bool symlink ( string $target , string $link )
symlink() 对于已有的 target 建立一个名为 link 的符号连接。
string readlink ( string $path )
readlink() 和同名的 C 函数做同样的事,返回符号连接的内容。

环境变量

string getenv ( string $varname )
获取一个环境变量的值。
bool putenv ( string $setting )
添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

加载扩展

bool dl ( string $library )
载入指定参数 library 的 PHP 扩展。

配置相关
string ini_get ( string $varname )

成功时返回配置选项的值。

1
string ini_set ( string $varname , string $newvalue )
2
string ini_alter ( string $varname , string $newvalue )

设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。
void ini_restore ( string $varname )
恢复指定的配置选项到它的原始值。

数字判断
bool is_numeric ( mixed $var )
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。
仅用is_numeric判断而不用intval转换就有可能插入16进制的字符串到数据库,进而可能导致sql二次注入。

数组相关
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。
该函数有一个特性,比较之前会进行自动类型转换。
in_array($str,$arr)判断$str是否在$arr数组里
image_1cartm29n1seoieq1o52b2qbn72d.png-28.9kB

变量覆盖

如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域:
void parse_str ( string $str [, array &$arr ] )
本函数用来将变量从数组中导入到当前的符号表中。检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突:
int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] )

bool mb_parse_str ( string $encoded_string [, array &$result ] )
解析 GET/POST/COOKIE 数据并设置全局变量。 由于 PHP 不提供原始 POST/COOKIE 数据,目前它仅能够
用于 GET 数据。 它解析了 URL 编码过的数据,检测其编码,并转换编码为内部编码,然后设置其值为 array
的 result 或者全局变量。
bool import_request_variables ( string $types [, string $prefix ] )
GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变
量,那么此函数就很有用。

1
<?php
2
$str = "first=value&arr[]=foo+bar&arr[]=baz";
3
4
// 推荐用法
5
parse_str($str, $output);
6
echo $output['first'];  // value
7
echo $output['arr'][0]; // foo bar
8
echo $output['arr'][47]; // baz
9
10
// 不建议这么用
11
parse_str($str);
12
echo $first;  // value
13
echo $arr[0]; // foo bar
14
echo $arr[1]; // baz
15
?>

列目录

array glob ( string $pattern [, int $flags = 0 ] )
glob() 函数依照 libc glob() 函数使用的规则寻找所有与 pattern 匹配的文件路径,类似于一般shell所用的规则一样。不进行缩写扩展或参数替代。
image_1caru9aiu1a5v1qr2p7m1pjlpjq2q.png-46.9kB
var_dump(glob('c*.php')); //列出c开头的PHP文件

无参数获取信息

返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量:
array get_defined_vars ( void )
返回当前所有已定义的常量名和值。 这包含 define() 函数所创建的,也包含了所有扩展所创建的:
array get_defined_constants ([ bool $categorize = false ] )
返回一个包含所有已定义函数列表的多维数组:
array get_defined_functions ( void )
返回所有被 include、 include_once、 require 和 require_once:
array get_included_files ( void )

image_1carv1gbf9am1c0rnic1gs9156f37.png-218.1kB


rand()函数:
image_1carsup0fqrg1uipj1q1oeb1okv13.png-29.6kB


$_REQUEST用法:
image_1cb26fq2i1upk16alpd18eb8pg1g.png-30kB


file_exists()函数:
检查文件或目录是否存在
image_1cauetnlg17n874k1qqf11suk537.png-34.8kB


exit用法:
image_1caufp0at1lt18k71uqkhg51eab3k.png-181.2kB
多处用在install.php里,因为成功安装一次之后就能再一次运行安装了,除非将exit删除了。