朋友的公司要做一个项目,其中需要在网页中打开PDF文件,所以准备购买一款在线阅 读PDF文件的控件产品。经过调研,他们准备选择国内一款名为“优看”的在线阅读PDF文件 的控件产品。这款产品是由西安优看电子科技有限公司开发的,在朋友公司的初步测试中, 该产品符合项目需要,安全测试结果也比较满意,但是,朋友还是不够放心,于是邀请我测 试一下,以防万一。 从西安优看电子科技有限公司的官方网站上,我们下载了优看PDF在线阅读控件的最 新版本,该版本以压缩包形式发布,解压后可以获得四个文件,其中名为“PDFView.cab” 的文件就是核心控件,而“PDFTest.html”则是一个由官方提供的测试网页文件。在本地计 算机上利用ASP本地测试工具搭建了一个Web测试环境,用记事本程序打开“PDFTest.html”, 我们需要修改其中的一些参数,主要有以下几个地方: <object id="YCanPDF" classid="clsid:474C1AB2-EFA5-4A19-9267-BA38B685C74A" codebase="http://127.0.0.1/pdfview.cab#version=3,4,0,0" width = 780 height = 500> function OpenURL() { YCanPDF.SetRCURL("http://www.ycanpdf.cn/rc/SC_TC_JP_KR.CAB",0);// 加载字体资源,只支持绝对路径 var n=YCanPDF.SetURL("http://127.0.0.1/YCanPDF PDFView OCX 3.4.0.0接 口文档.pdf","");// 打开网络的PDF文件 上述代码标红的地方,原本的网址是指向优看官方网站的,这里因测试需要,我们暂 时修改为了本地计算机的回环地址,即127.0.0.1。 将优看PDF在线阅读控件压缩包文件全部解压到Web目录下,运行浏览器访问 “PDFTest.html”文件,此刻会出现一个安装控件的提示,如图1所示。 ![]() 直接点击“安装”按钮,系统会自动注册优看PDF在线阅读控件。控件注册完毕后, 点击“打开网络”按钮,这是我们就可以在浏览器中看到“YCanPDF PDFView OCX 3.4.0.0 接口文档.pdf”文件的内容,如图2所示。 ![]() 通过“YCanPDF PDFView OCX 3.4.0.0 接口文档.pdf”文件,我们可以知道优看PDF 在线阅读控件有 34 个外部接口函数,并且其参数大部分都是字符串类型,这其中,很多都 代表文件的名称,如long SetFileName(LPCTSTR filename, LPCTSTR password, long lParams),这个外部接口中,第一个参数filename就代表着要被打开的PDF文件名称。之所 以我们非常关心这些参数的类型和意义,是想要测试发现优看PDF在线阅读控件会不会存在 缓冲区溢出漏洞,可是,在实际的测试中,我们发现优看PDF在线阅读控件对超长的字符串 文件名称做了一定防范,或者说不是防范而是借助系统函数本身处理错误的机制避免了缓冲 区溢出漏洞的发生。举个例子来说明一下,例如我们给“long SetURL(LPCTSTR szFilePath, LPCTSTR szPassword);”这个用来打开网络上PDF文件的外部接口传递一个超长的文件名参 数szFilePath,在测试中,浏览器就会给出下载失败的提示,如图3 所示。 ![]() 看了上面的测试结果,我们似乎不指望能够发现优看PDF在线阅读控件的什么安全漏 洞了,但是,安全测试需要严谨的态度,我们前面只是对优看PDF在线阅读控件的外部接口 函数做了单独测试,并没有将这些参数结合起来进行系统化的测试,所以,我们的测试还不 全面,不能轻言放弃测试。 在阅读优看PDF在线阅读控件的说明书时,我们发现了一个有趣的外部接口函数: long SearchStr(LPCTSTR strKey, long bCaseSensitive, long bAllPages)。该函数的作用是用 来在打开的PDF文件中搜索指定的字符串。如果单独调用这个函数,并传递给它一个超长字 符串,测试代码这样写:var a=Array(60000);YCanPDF.SearchStr(a,0,0);。浏览器只会提 示出“没找到”,如图4所示。 ![]() 出现这样的结果原因很简单,主要是由于当前没有打开任何PDF文件,搜索函数无法正常 |