-
-
[原创]从一个 JS 文件到整站沦陷:SQL注入、任意上传与任意读取挖掘实录
-
发表于: 12小时前 101
-
拥有授权后,打开一个资产看到
易宝OA二开版本,可以尝试审计下JS(这一步其实也可以通过小熊猫来完成)
nday没用,F12->Sources->Page->展开站点域名->Themes->Script 可直接点开每个文件
发现存在四个JS文件:FunctionJS.jscloud.jsjquery-1.8.2.min.jsjquery.cookie.js
先有个大致的判断,如JQuery*是第三方库,可以跳过,就算有也是不收的那种低危XSS
cloud.js点开是只有 offset1/offset2 浮动云动画,跳过
FunctionJS.js大小是41,659B,判断是业务核心
先看有没有封装 $.ajax
此处的登录页内联脚本调用了 getAjax(...),但页面本身没有定义它
于是去已加载的 JS 里搜 function getAjax
命中FunctionJS.js
既然所有接口都走这个封装,就在同一个文件里搜所有 getAjax( 调用点,接口清单自然就出来了
PS:页面调用 → 找定义 → 定义给出“怎么发请求” → 同文件所有调用点给出“有哪些接口”。
这个JS只有10处,其中硬编码 URL 的调用点(5 处,直接出接口)
变量 URL 的调用点(4 处,二次转发)
delConfig、delConfigNotRefresh、DeleteData、IsExist_Data——这些函数的 url 参数由调用它们的页面传入,这个JS文件里搜不出具体端点
但是在这里感觉存在SQL注入

"title"+titleHtml
这种直接拼接上的大概率存在
/DataProcessing/TestSample/TestSample.ashx 无需登录即可访问,title 参数被直接拼接进 SQL。
使用union注入

sa权限?
后续测试也存在时间盲注与堆叠查询
尝试读取数据库

数据库文件路径:

成功读取 C:\Windows\System32\drivers\etc\hosts
对目录进行扫描看是否还有隐藏点
发现500状态的upload
错误页泄露物理路径/类名/行号
其中这两段是堆栈里有价值的代码,再往下全是框架管道
堆栈显示代码位于 ...\WebSite\WebSite\ClassOffice\Upload.cs,Upload.cs:67 + HttpFileCollection.Get(Int32 index) 证明代码直接使用 Request.Files[0],未做扩展名白名单/重命名/鉴权;页面 upload.aspx.cs:22 在 Page_Load 中直接走上传逻辑
上传逻辑位于 WebSite.ClassOffice.Upload.UploadFile(),页面本身是空壳表单
现在知道了/Upload.aspx无鉴权,Page_Load直接Request.Files[0]
堆栈落在 Upload.cs:67
但是现在传到哪里也不知道,这时候尝试用异常类型反推代码在做什么
放到burp中用multipart/form-data,上传一个 300 字符的超长文件名
返回 500,异常是:
PathTooLongException 是路径拼接/保存阶段的异常,不是文件名不合法的校验异常,只有原始文件名被原样拼进目标路径的时候,文件名过长才会触发路径过长
如果代码做了 GUID 重命名、只存数据库或者先做白名单校验,通常是别的报错,而不是 PathTooLongException,堆栈仍停在 Upload.cs:67和 Request.Files[0] 同一处,说明取文件、拼路径、保存都在这
这里尝试使用原始 filename 被直接用于路径拼接,../和..\都尝试,但因为前面看路径是Windows的,而Windows大小写不敏感,所以Windows 同时接受 \ 和 /
那就我们上传文件的目录再网站根目录的下两层,../../刚好回到根目录,构造payload
响应:
尝试访问上传文件:
9e5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4S2^5P5q4)9J5c8X3q4F1P5r3I4Q4y4h3k6H3L8$3y4Q4y4h3j5J5x3o6t1$3x3e0p5H3z5g2)9J5k6h3q4K6M7s2R3`.
点到为止,可以交差啦,如有漏码,请及时提醒,谢谢师傅们!