下个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编码绕过{{
的限制