ToB企服应用市场:ToB评测及商务社交产业平台

标题: 网络安全-php安全知识点 [打印本页]

作者: 兜兜零元    时间: 6 天前
标题: 网络安全-php安全知识点
写给和我一样没学过php的安全小白,只是为了让你看懂php代码,专门学后端的请出门左转。学安全需要学的东西太多,你不大概把js学的和做前端的同砚一样好、把php学的和做后端的一样好,把数据库学的和做数据库优化的同砚一样好,把Apache学的和做服务器端的同砚一样好,我们只能关注他们涉及的范畴中不安全的因素,找到毛病,提出修改意见。
php是后端常用的语言,在靶机或CTF比赛中也需要进行php代码审计,所以就看看从学安全的角度需要关心哪些部分。
语法与注释
PHP以 <?php 开始,以 ?> 结束:
   <?php
// PHP 代码
?>
   
<?php
// 这是 PHP 单行注释

/*
这是
PHP 多行
注释
*/
?>
  输出
在 PHP 中有两个基本的输出方式: echo 和 print。
echo 和 print 区别:

echo是经常用的,一般用于回显,好比sql注入时回显查询语句结果。
变量
PHP 变量规则:

php是弱范例语言,不用在变量前面加范例。从学安全的角度,能看懂哪个是变量就ok了,假如以后学的更深入了,需要使用php来写POC,进行持续性毛病再回过头来学习命名规则等。
弱范例安全

php中有一些相称的值

在PHP中,比力两个值是否相称可以使用“==”或“===”,前者会主动进行范例转换。
  1. <?php
  2. $input = "1abc";
  3. if($input==1)
  4. {
  5.         echo "flag";
  6. }
  7. ?>
复制代码
 结果如下:


其他的请读者自行尝试。
超等全局常量
常量值被界说后,在脚本的其他任何地方都不能被改变。
PHP 超等全局变量列表:

$GLOBALS 是一个包含了全部变量的全局组合数组,变量的名字就是数组的键,在一个PHP脚本的全部作用域中都可以访问。
   $GLOBALS["___mysqli_ston"] 
  
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。
元素/代码形貌$_SERVER['PHP_SELF']当前实行脚本的文件名,与 document root 有关。比方,在地点为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(比方包含)文件的完备路径和文件名。 从 PHP 4.3.0 版本开始,假如 PHP 以下令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。$_SERVER['GATEWAY_INTERFACE']服务器使用的 CGI 规范的版本;比方,"CGI/1.1"。$_SERVER['SERVER_ADDR']当前运行脚本所在的服务器的 IP 地点。$_SERVER['SERVER_NAME']当前运行脚本所在的服务器的主机名。假如脚本运行于假造主机中,该名称是由那个假造主机所设置的值决定。$_SERVER['SERVER_SOFTWARE']服务器标识字符串,在相应哀求时的头信息中给出。 (如:Apache/2.2.24)$_SERVER['SERVER_PROTOCOL']哀求页面时通讯协议的名称和版本。比方,"HTTP/1.0"。$_SERVER['REQUEST_METHOD']访问页面使用的哀求方法;比方,"GET", "HEAD","OST","UT"。$_SERVER['REQUEST_TIME']哀求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)$_SERVER['QUERY_STRING']query string(查询字符串),假如有的话,通过它进行页面访问。$_SERVER['HTTP_ACCEPT']当前哀求头中 Accept: 项的内容,假如存在的话。$_SERVER['HTTP_ACCEPT_CHARSET']当前哀求头中 Accept-Charset: 项的内容,假如存在的话。比方:"iso-8859-1,*,utf-8"。$_SERVER['HTTP_HOST']当前哀求头中 Host: 项的内容,假如存在的话。$_SERVER['HTTP_REFERER']引导用户代理到当前页的前一页的地点(假如存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)$_SERVER['HTTPS']假如脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。$_SERVER['REMOTE_ADDR']浏览当前页面的用户的 IP 地点。$_SERVER['REMOTE_HOST']浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。$_SERVER['REMOTE_PORT']用户呆板上毗连到 Web 服务器所使用的端口号。$_SERVER['SCRIPT_FILENAME']当前实行脚本的绝对路径。$_SERVER['SERVER_ADMIN']该值指明白 Apache 服务器配置文件中的 SERVER_ADMIN 参数。假如脚本运行在一个假造主机上,则该值是那个假造主机的值。$_SERVER['SERVER_PORT']Web 服务器使用的端口。默认值为 "80"。假如使用 SSL 安全毗连,则这个值为用户设置的 HTTP 端口。$_SERVER['SERVER_SIGNATURE']包含了服务器版本和假造主机名的字符串。$_SERVER['PATH_TRANSLATED']当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行假造到真实路径的映像后的结果。$_SERVER['SCRIPT_NAME']包含当前脚本的路径。这在页面需要指向自己时非常有效。__FILE__ 常量包含当前脚本(比方包含文件)的完备路径和文件名。$_SERVER['SCRIPT_URI']URI 用来指定要访问的页面。比方 "/index.html"。
用于收集HTML表单提交的数据。

HTML form标签的属性method="get"时,$_GET可以收集URL中发送的数据。

HTML form标签的属性method="post"时,$_POST可以收集表单中发送的数据。

函数
常用


创建数组

检测变量是否为数字或数字字符串,注意,可以是16进制,字符串转16进制可以绕过。is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值。
由于php是弱范例语言,会使用这个函数来判断一下。

天生随机整数

耽误实行当前脚本多少秒

检测变量是否已设置并且非 NULL

输出一条消息,并退出当前脚本。

以下值在md5加密后以0E开头:
可以用于md5相称,但两值不相称的情况
base64_encode()、base64_decode()、sha1() 和 strcmp()
传入数组,返回NULL
字符串干系

正则表达式


实行一个正则表达式匹配


匹配
这里需要注意一下 i ,表示巨细写不敏感,即php、PHP、PhP都会被过滤掉,有的时间没有写i,黑名单里面有select关键字时,我们可以使用SELECT来绕过。

返回字符串的一部分,字符串可以包含中文,substr函数是不能包含中文的。


子串
子字符串位置


查找字符串在另一个字符串中首次出现的位置(汉字占一个位置),假如没有找到字符串则返回 false。雷同的还有:

安全问题
由于返回的是false,一旦使用==进行判断,我们可以构造第二个字符串是第一个的开始,即可绕过
  1. <?php
  2. $str1 = "abcd";
  3. $str2 = "ab";
  4. if(strpos($str1,$str2)==false)
  5. {
  6.         echo "flag";
  7. }
  8. ?>
复制代码


绕过结果

替换字符串中的一些字符(区分巨细写),注意,可以通过双写或者巨细写进行绕过。

实行一个正则表达式搜索和替换。这个就不太好弄了,大概需要编码绕过。

把一些预界说的字符转换为 HTML 实体。
预界说的字符是:
故可以使用单引号的payload进行绕过。

剥去字符串中的 HTML、XML 以及 PHP 的标签。

返回在预界说的字符前添加反斜杠的字符串。
预界说字符是:
数据库干系

mysqli


打开一个到 MySQL 服务器的新的毗连。

返回最近调用函数的最后一个错误形貌。

关闭先前打开的数据库毗连。

实行某个针对数据库的查询

从结果集中取得一行作为关联数组

从结果集中取得一行,并作为枚举数组返回

返回结果集中行的数目

转义在 SQL 语句中使用的字符串中的特殊字符,难道转义后我们就没有办法注入了?NO!!!
php官方函数参考手册中写到,会被进行转义的字符包括: NUL (ASCII 0),\n,\r,\,'," 和 Control-Z.
也就是或假如是数字型注入,比方,payload是 1 and 1=1# ,那么这个函数没有效,因为payload中不包含以上字符。
另外,在调用 mysqli_real_escape_string() 函数之前, 必须先通过调用mysqli_set_charset()函数或者在 MySQL 服务器端设置字符集。假如字符集设置不当,可以通过宽字节注入来进行绕过。
pdo

PHP 数据对象 (PDO) 扩展为PHP访问数据库界说了一个轻量级的同等接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。


为 PDOStatement::execute() 方法准备要实行的SQL语句,SQL语句可以包含零个或多个命名(:name)或问号(?)参数标志,参数在SQL实行时会被替换。这样就没法粉碎sql语句的结构,不是拼接。
举例:
   prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
  你以为sql语句是
   SELECT first_name, last_name FROM users WHERE user_id = id LIMIT 1;
  于是使用 1 or 1=1#作为payload,以为下面的sql语句会被实行
   SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1#
  但实际上实行的是
   SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1# LIMIT 1;
  或者说 直接判断 1 or 1=1# 是不是数字型参数,不是的话根本就不会去实行,也就安全了。

绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。
比方(绑定变量id与prepare里的id):
   bindParam( ':id', $id, PDO:ARAM_INT )
  
实行预处理过的语句。 

从一个 PDOStatement 对象干系的结果集中获取下一行。

返回上一个由对应的 PDOStatement 对象实行DELETE、 INSERT、或 UPDATE 语句受影响的行数。
伪协议干系

伪协议方法
反序列化毛病
PHP提供serialize和unserialize函数,将任意范例的数据转换成string范例或者相反。当unserialize函数的参数被用户控制的时间就会形成反序列化毛病。
serialize函数

serialize() 函数用于序列化对象或数组,并返回一个字符串序列化对象后,可以很方便的将它通报给其他需要它的地方,且其范例和结构不会改变。
string serialize ( mixed $value )
参数
$value: 要序列化的对象或数组。
返回
字符串
unserialize函数

unserialize() 函数用于将通过serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。
mixed unserialize ( string $str )
参数
$str: 序列化后的字符串。
返回
返回的是转换之后的值,可为 integer、float、string、array 或 object。
假如通报的字符串不可解序列化,则返回 FALSE,并产生一个 E_NOTICE。
魔法函数

序列化对象就要谈到类,其中有三个魔法函数:__construct、__destruct、__toString。
  1. <?php
  2. class test{
  3.         var $url;
  4.         var $name;
  5. function __construct( $par1, $par2 ) {
  6.    $this->url = $par1;
  7.    $this->name = $par2;
  8.         echo "call __construct<br>";
  9. }
  10.         function __toString() {
  11.                 echo "call __toString<br>";
  12.                 return $this->url;
  13.        
  14. }
  15.         function __destruct() {
  16.                 echo "call __destruct<br>";
  17.                 echo "bye<br>";
  18. }
  19. }
  20. $t = new test('https://blog.csdn.net/lady_killer9','FrankYu');
  21. echo $t . PHP_EOL;
  22. ?>
复制代码

魔法函数

举例

有这样一段代码
  1. <?php
  2. class test{
  3.         var $path = "";
  4.         function __toString() {
  5.                 $file = fopen($this->path, "r") or exit("无法打开文件!");
  6.                 // 读取文件每一行,直到文件结尾
  7.                 while(!feof($file))
  8.                 {
  9.                     echo fgets($file). "<br>";
  10.                 }
  11.                 fclose($file);
  12.                 return $this->path;
  13. }
  14. }
  15. $para = '';
  16. echo unserialize($para);
  17. ?>
复制代码
其中,para是你可控的,代码的作用就是反序列化你传入的参数,然后打印出来。
分析:打印必调用__toString函数,__toString函数中会打开$path文件,所以,我们需要构造一个path为敏感文件路径的test类对象,并得到序列化后的字符串,将该字符串作为参数para。
  1. <?php
  2. class test{
  3.         var $path = "";
  4.         function __toString() {
  5.                 $file = fopen($this->path, "r") or exit("无法打开文件!");
  6.                 // 读取文件每一行,直到文件结尾
  7.                 while(!feof($file))
  8.                 {
  9.                     echo fgets($file). "<br>";
  10.                 }
  11.                 fclose($file);
  12.                 return $this->path;
  13. }
  14. }
  15. $hack = new test();
  16. $hack->path = "/box/script.php";
  17. echo serialize($hack);
  18. ?>
复制代码


得到序列化字符串
成功读取了敏感文件/box/script.php


显示了服务器保存的代码
网络安全学习路线

对于从来没有打仗过网络安全的同砚,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,各人跟着这个大的方向学习准没问题。



同时每个成长路线对应的板块都有配套的视频提供:

需要网络安全学习路线和视频教程的可以在评论区留言哦~
最后

   
    给小同伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为可以或许帮你节省大量的时间和精力成本。对峙住,既然已经走到这条路上,虽然出息看似困难重重,只要咬牙对峙,终极会收到你想要的效果。
  黑客工具&SRC技术文档&DF册本&web安全等(可分享)


结语

网络安全财产就像一个江湖,各色人等聚集。相对于西欧国家根本扎实(懂加密、会防护、能挖洞、擅工程)的浩繁名门正派,我国的人才更多的属于旁门左道(很多白帽子大概会不服气),因此在将来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、团结“业务”与“数据”、“主动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。
   特殊声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒各人对网络安全的器重,并采取相应的安全步调,从而减少由网络安全而带来的经济丧失
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4