SCTF jsonhub

Posted on 2020-07-08,3 min read

下个docker本地搭环境
有个Web1和Web2
先看Web1
app/web1/web1/urls.py中。定义了几个路由

urlpatterns = [
    re_path(r"admin/",admin.site.urls),
    re_path(r'reg/', reg),
    re_path(r'login/', login),
    re_path(r'home/', home),
    re_path(r'rpc/', flask_rpc),
]

admin路由是django自带的管理界面
其他的是app/web1/app/views.py
有注册。登陆。home。rpc
查看views.py中对应的函数。发现是调用的diango的auth。而diango自带的admin界面能否登陆。是由以下几个选项控制的。

is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'))
is_active = models.BooleanField(_('active'), default=True, help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.'))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_('Designates that this user has all permissions without explicitly assigning them.'))

在reg的时候。加上这几个选项。即可将一个普通用户。注册为能登陆admin界面的用户

{"username":"guoke","password":"guoke","is_staff":1,"is_superuser":1}

然后登陆admin界面。得到Token。
在home目录下。会验证Token。然后check URL。然后request请求

Token已经得到了。看下ssrf_check

def ssrf_check(url ,white_list):
    for i in range(len(white_list)):
        if url.startswith("http://" + white_list[i] + "/"):
            return False
    return True
就是限制了只能是http://白名单IP/这种格式

https://xz.aliyun.com/t/3302
构造http://白名单IP//127.0.0.1:8000
即可成功访问本机的8000端口
本地的/rpc路由。可以对任意URL。进行POST

看下web2。很明显的SSTI。

json接受三个参数。num1/num2/symbols
num1和num2不能出现a-z。symblos必须带上那几个符号
WP中有几个构造方式。

symbols随便加个符号绕过

{"num1":"1{","num2":"}2","symbols":"{'+'.__class__}"}

或者用\u unicode编码绕过{{的限制

下一篇: 安恒培训摸底题→