代码审计基础总结
查阅大量资料后,列出的常见代码审计漏洞。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | 代码审计 =================================================================================================== * sql注入 ** 变量未过滤导致 *** http: //www.test404.com/post-811.html - $_SERVER变量未过滤,请求头中X_FORWARDED_FOR,CLIENT_IP,HTTP_HOST,ACCEPT_LANGUAGE - 传入的参数未强制转为 int - 数组只过滤了value未过滤key,但key也会代入到sql中 - $_FILES变量未过滤( http: //www.test404.com/post-815.html ) ** 过滤函数的误用 *** http: //www.test404.com/post-809.html - str_replace将单引号去掉了,结果转义符反斜杠留下了,导致在sql语句中将真正的单引号转义了 - 在带入sql语句前,stripslashes将转义符去掉了 - 多余的urldecode,导致单引号的“二次编码”%2527可以绕过单引号过滤 ( http: //www.test404.com/post-808.html ) ** 二次注入 - 单引号被转义后入库或入文件,再次以该字段为查询条件时触发 ** 宽字节注入 - gpc或addslash添加了转义符%5c * 命令注入 - popen - proc_open - exec - system - passthru - 反引号 * 代码注入 ** pgrep_replace ** eval ** assert ** 双引号 - php -r '$a = "${${eval(phpinfo())}}";' - php -r '$a = "${@eval(phpinfo())}";' - php -r '$a = ${@eval( "phpinfo();" )}; - php -r '$a = ${${eval("phpinfo();")}};' * xss反射 ** 直接回显 $_SERVER[ 'HTTP_REFFER' ] ** $_SERVER[ 'PHP_SELF' ] ** $_SERVER[ 'HTTP_URI' ] ** $_SERVER[ 'USER_AGENT' ] * xss存储 ** 留言板未使用 htmlspecialchars 过滤 * CSRF 利用了网站对用户的信任 ** 敏感表单未加token验证 ** 防御 - 不要采用 get 方式提交 - 添加令牌验证 - 验证请求来源,http_reffer,但可被绕过 - 在http头部添加自定义属性来验证 * 文件包含 ** 本地包含,受gpc影响 - 技巧 %00截断 ** 远程包含,需要php.ini中 allow_url_include 与 allow_url_fopen 开启 - 技巧:追加 ? # 等字符 ** 伪协议 - php: //input,并post提交<?php phpinfo();?>, 需要allow_url_inlcude开启且php>5.2.0 - php: //filter/read=convert.base64-encode/resource=based64-php-code.txt, 无需什么条件 * 动态函数执行与匿名函数执行 ** 动态函数:函数名以参数形式传进来,直接跟括号得到调用。 ** 匿名函数:类似lambda函数,但函数体在在定义时引入了外部字符串变量,使得可以注入恶意代码。 * 反序列化漏洞 ** 构造的序列化字符串在反序列化后会覆盖类的成员变量。结合其他代码执行漏洞,得到利用。 * 变量覆盖漏洞 ** 如果自动注册全局变量默认开启,地址栏提交的参数会被定义成变量。 - 变量未初始化时,会被覆盖,可导致修改module之类的变量,导致文件包含漏洞; ** 动态定义变量 - http: //www.test404.com/post-815.html - 使用双美元符$$,动态定义变量时。 - 危险函数extract,会从字典中动态提取键值对来定义变量 * 文件管理漏洞 ** 危险函数copy、unlink,存在时间竞争漏洞。 - http: //www.test404.com/post-875.html - 上传头像-->生成临时文件(tmp.php)-->不断请求tmp.php(在上层目录生成shell.php文件)-->删除当前目录下tmp.php等非jpg文件,但留下了上层目录下的shell.php文件-->成功! * 上传漏洞 ** 危险函数:比如getimagesize,如果文件头部以GIF89a开头,那么该文件就被判断为图片文件。 - 参见 http: //www.test404.com/post-875.html ** 未授权引用:比如直接访问上传接口 * 验证码漏洞 ** 抓包构造sid,发送空验证码,可绕过条件判断 - 不通过页面访问时,没生成验证码,弱类型比较时NULL== '' 为真 ** 第一次通过页面刷新获取验证码,后续抓包反复提交该验证码 - 无论验证码是否输入正确与否,后台都应该重新生成验证码 * php中的奇怪现象 ** 弱类型比较时存在绕过判断条件的漏洞 *** 传递的参数为数组时,函数一般返回为NULL。 - ?goods[]=92%004&goods[]=967&goods[]=993 $_GET: array(1) { [ "goods" ]=> array(3) { [0]=> string (4) "924" [1]=> string (3) "967" [2]=> string (3) "993" } } $_GET[ "goods" ]: array(3) { [0]=> string (4) "924" [1]=> string (3) "967" [2]=> string (3) "993" } ereg( '123' , '456' ): bool ( false ) ereg( "^[0-9a-zA-Z]+$" , $_GET[ "goods" ]): NULL ereg( "^[0-9a-zA-Z]+$" , $_GET[ "goods" ])!==False: bool ( true ) ereg( "^[0-9a-zA-Z]+$" , $_GET[ "goods" ])!=False: bool ( false ) $_GET[ "goods" ]>9999999: bool ( true ) strcmp($_GET[ "goods" ], "123123" ): NULL strcmp($_GET[ "goods" ], "123123" )==0: bool ( true ) *** 弱类型的比较 - var_dump( "1e8" >999): bool ( true ) - var_dump( "1e8" > "999" ): bool ( true ) - var_dump( "1e8asdfasdf" >999): bool ( true ) - var_dump( "1e8asasdf" > "999" ): bool ( false ) - var_dump( "0e8" ==0): bool ( true ) - var_dump( "0e8" == "0" ): bool ( true ) - var_dump( true == "asfasdfsfsadf" ): bool ( true ) |
自助者天助;自天佑之,吉无不利。
分类:
网站安全
标签:
代码审计 基础 总结 php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库