又补了一大章节的课程,对我来讲感受不少都要学习,不太会,那就先熟悉流程php
一、Fortify SCAhtml
二、Checkmarx CxSuitemysql
三、360代码卫士git
参考:https://www.jianshu.com/p/cd1cb66e4d7d程序员
参考:https://www.oschina.net/p/seaygithub
参考:https://www.cnblogs.com/qiumingcheng/p/7253917.htmlweb
参考:https://zhuanlan.zhihu.com/p/32363880算法
参考:https://github.com/alpha1e0/kiwisql
参考:shell
https://wps2015.org/drops/drops/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%85%A5%E9%97%A8%E6%80%BB%E7%BB%93.html
(1) 本地文件包含:
(2) 远程文件包含:
(3) 文件包含截断:
(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件便可利用。
(2) 黑名单扩展名过滤:
(3) 文件头 content-type
验证绕过:
(4) 防范:
(1) preg_replace()
函数:
(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):
(3)eval()和assert():
(1) popen
和proc_open()
:
(2) 反引号命令执行:
(1) in_array(): 比较以前会自动转换类型 (2)is_numeric():当传入参数为hex时 直接经过并返回true 而且MYSQL能够直接使用hex编码代替字符串明文 能够二次注入 而且可能形成XSS漏洞
(3)双等于==
和三等于===
:
(1) 未exit/return/die:
(2) 支付漏洞
(1) 钻GPC等转义的空子:
GBK的宽字节注入
(2)字符串问题:
a.eval()
b.assert()
c.create_function()
常见的包含函数:require,include,require_once,include_once
include $file 中,若是变量 $file 可控,则就能够包含任意文件。
此外,根据不一样的配置环境,能够包含不一样的文件:远程文件和本地文件。
包含函数还能够经过支持的协议和封装协议以及 过滤器读取任意文件内容。
例子,如
利用php流filter读取任意文件
include($_GET('file');
// ?file=php://filter/convert.base64-encode/resource=index.php
上面的代码中,就经过filter读取index.php的内容,并将内容编码成base64再输出。
常见的命令执行函数有:
* exec() -- 执行一个外部程序
* passthru() -- 执行外部程序并显示原始输出
* proc_exec() -- 经过shell环境执行命令,而且将完整的输出以字符串的方法返回
* system() -- 执行外部程序,而且显示输出
* popen() -- 经过popen()的参数传递一条命令,并对popen()所打开的文件进行执行。
copy() -- 拷贝文件
file_get_contents() -- 将整个文件读入一个字符串
file_put_contents() -- 将一个字符串写入文件
file() -- 将整个文件读入一个数组中
fopen() -- 打开文件或者URL
move_uploaded_file() -- 将上传的文件移动到新位置
readfile() -- 读取文件
rename() --重命名文件或者目录
rmdir() -- 删除目录
unlink() & delete() -- 删除文件
详细参考连接:https://www.zybuluo.com/Dukebf/note/715934
https://www.bbsmax.com/A/pRdB8DR6Jn/
sql注入漏洞一般有两种利用方式。一种是权限较大,直接写入webshell,另一种是权限较小,可是能够读取用户帐号密码,好比读取管理员帐号密码,登陆后台管理。
sql注入常常出如今登陆页面http请求中的user-agent,client-ip,x-forward-for等可能会被程序存储到数据库中的地方。另外,在订单处理的地方,因为业务逻辑复杂,常常会有二次注入漏洞。
至于在白盒审计中,若想定向挖掘sql注入漏洞,只须要注意这几个数据库操做关键字:select from , mysql_connect , mysql_query , mysql_fetch_now , update , insert , delete ; 查到这些关键字后,定向追踪他们,就能够审计sql注入漏洞
程序在进行一些操做以前,常常会进行一些编码处理,经过输入一些编码函数不兼容的特殊字符,能够致使输出的字符变成有害数据。其中最多见的编码注入就是mysql的宽字节注入以及urldecode/rawurldecode这两个函数。
怎么说呢,这个漏洞之前研究过,可是老是没研究透。我的感受,只要是set character_set_client='gbk'或者set NAMES 'gbk',那么就可能存在漏洞。至于原理虽然没法搞的十分清楚,可是能够直接手工测试。看可否吃的掉转义字符。
解决这个漏洞的方法:
第一种方法,set NAMES 'gbk' 以后,在 set character_set_client=binary就能够了。
第二种方法,使用pdo方式,在php5.3.6及如下版本设置 setAttribute(PDO::ATTR_EMULATE_PREPARES,false);来禁用prepared statements的仿真效果。
综上所述,要想看代码中是否有宽字节注入,那么搜索几个关键字:
SET NAMES
character_set_client
mysql_set_charset('gbk')
若是目标网站开启了GPC,而且用了urldecode或者rawurldecode函数,那么经过二次解码,第二次就会解析出单引号,致使注入。
所以,在代码审计中,能够经过搜索urldecode和rawurldecode来挖掘二次注入漏洞。
一般,程序要么被动获取参数,好比get,post;要么主动读取文件或者远程页面;所以,过滤好这两条路,就能够防止sql注入。
在PHP的核心配置中,magic_quotes_gpc负责对get,post,cookie的值进行过滤,magic_quotes_runtime对从数据库中或者文件中获取的数据进行过滤。
可是,上面两种方法只能过滤部分sql注入,由于他们只是转义了单引号,双引号,反斜杠\,空字符null,对int注入没什么用。由于int类型能够直接接sql语句,不须要闭合。
这个函数对参数中的单引号,双引号,反斜线,空字符进行过滤。可是有的程序员在开发的时候,没有考虑到get请求中可能存在数组(这个函数是对字符串进行过滤),致使了绕过。
说实话,get请求中带数组是怎么带的?这个我还真比较懵。估计得完整开发一个网站以后,才能知道get请求中带数组是怎么回事?
这个函数也是过滤,第一个参数是字符串,第二个参数可选,是数据库链接,若没有设置第二个参数,那就默认为上一次链接的数据库。
这个函数主要过滤的是:\x00,\n,\r,\,',",\x1a
可是,这里的\x00和\x1a我不太懂是什么意思。
前面的函数针对的是字符型注入,对Int型注入效果不是太好。所以,这个intval()函数就是以白名单的思想,对数据进行过滤。
A.move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者能够绕过。
B.getimagesize函数验证:只要在文件头添加GIF89a便可;
C文件头content-type验证绕过:验证$_FILES[“file”][“type”]的值,这个是可控的。
D.函数误用致使上传绕过
以iconv()函数为例,在iconv转码的过程当中,utf->gb2312(其余部分编码之间转换一样存在这个问题)会致使字符串被截断,如:$filename=”shell.php(hex).jpg”;(hex为0x80-0x99),通过iconv转码后会变成$filename=”shell.php “。
E.竞争上传,主要涉及到的为copy函数。
文件上传首先须要一个表单,以下,咱们把它叫作a.html
:
<form action="t.php" method="post" enctype="multipart/form-data"><input name="aaa" type="file" /><input type="submit" /></form>
这里有几个要素:
action
属性是提交的目标。method
属性是提交所用的HTTP方法,经常使用的就是 POST 和 GET,文件上传通常用 POST。enctype
属性必需要写成这样,由于文件上传和普通的提交具备不一样的编码方式。若是不写的话,可能会被当作urlencoded
,就是k1=v1&k2=v2
的键值对形式,致使解析不出东西。name
属性很是重要,它是PHP脚本中寻找文件的关键字。接下来是PHP脚本中的东西,PHP中经过$_FILES
对象来读取文件,经过下列几个属性:
$_FILES[file]['name']
- 被上传文件的名称。$_FILES[file]['type']
- 被上传文件的类型。$_FILES[file]['size']
- 被上传文件的大小(字节)。$_FILES[file]['tmp_name']
- 被上传文件在服务器保存的路径,一般位于临时目录中。$_FILES[file]['error']
- 错误代码,0为无错误,其它都是有错误。t.php
中的代码写成这样:
<?phpif(!isset($_FILES['aaa'])) { echo 'file not found'; exit(); } var_dump($_FILES['aaa'])
能够看到那个aaa
就是文件输入框中的name
属性。
咱们把这两个文件放到服务器的目录中,或者直接在目录下启动PHP自带的服务器。以后打开a.html
随便传上去一个文件,会获得这样的结果,这里我直接上传了a.html
:
array(5) { ["name"]=> string(6) "a.html" ["type"]=> string(9) "text/html" ["tmp_name"]=> string(44) "C:\Users\asus\AppData\Local\Temp\php43A1.tmp" ["error"]=> int(0) ["size"]=> int(133) }
须要说的是,在处理文件上传的时候,不该信任文件类型type
,由于类型在浏览器生成以后,是能够改的。甚至能够手动构造出于类型与实际内容不匹配的数据包。
同时也不该该信任文件名称name
。而是应该分离文件名与扩展名,对扩展名进行白名单过滤。文件名按需舍弃从新生成,或者过滤后再使用。
A、PHP网站的定义:
B、PHP反序列化
二、理解PHP反序列化漏洞
三、PHP反序列化漏洞利用的前提
a.unserialize()函数的参数可控;
b.php文件中存在可利用的类,类中有魔术方法
四、PHP反序列化漏洞—发现技巧
五、PHP反序列化漏洞—构造exploit思路
六、案例分析
https://www.cnblogs.com/xiaozi/p/7839256.html
https://www.grt1st.cn/posts/php-unserialize-analysis/
注:以上大多转自破壳笔记学习资料,欢迎你们前来报名学习