Python - XSS

参考资料:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-xss/kbid-3-cross-site-scripting

靶场环境搭建

$ sudo docker pull blabla1337/owasp-skf-lab:xss

一些docker常用命令:
docker search <名称> #搜索镜像
docker pull <名称> #下载镜像
docker run -d -p 80:80 <镜像名称>
-d 后台运行
-p 后跟端口 port1:port2 将容器内部服务器端口port2映射到本地端口port1(如果-p后什么也不写,随机分配端口)
--rm 容器停止之后会自动删除
docker images #查看本地已经下载好的镜像
docker info #查看docker信息
docker ps #查看运行中的docker
docker stop 容器名/id #关闭容器
docker start 容器名/容器id #开启容器
docker rm 容器名/容器id # 删除

跑起来
$ sudo docker run -ti -p 127.0.0.1:5000:5000 blabla1337/owasp-skf-lab:xss
此时可以在虚拟机中访问靶场了
但如果想在物理主机上访问,参考这篇教程:https://www.sohu.com/a/273017267_649850
注意关闭kali的防火墙服务

XSS

输入最常用的语句:><script>alert(1)</script>

成功弹窗
查看源码:

@app.route("/home", methods=['POST'])
def home():
    xss = request.form['string']
    return render_template("index.html",xss = xss)
<center> <p style="font-size:2em;">

<div data-gb-custom-block data-tag="autoescape" data-0='false'>{{xss}}</div>

</p></center>

查了资料之后我才知道,这是flask模板

参考资料:https://www.mianshigee.com/note/detail/228332mqe/

string变量即是输入的字符串,由render_template返回index.html页面时,携带一些变量数据给Jinja2语法进行渲染。
这是一般情况下的显示:↓

如果后台返回给前端的变量为一段html代码,返回给前端经过Jinja2语法渲染后,效果会是:↓

可以看到,返回的变量中包含html代码,但是Jinja2语法并没有对这一小段代码进行渲染,而是直接显示了出来。在flask中,如果确认后台返回给前端进行渲染的变量中包含的HTML代码是安全的,则可以使用一些方法来对这段HTML代码也进行渲染,其中一种就是靶场中用到的autoescape 关闭安全机制,即设置为false,这就造成了xss可利用的点

用burpsuite抓包看看内容(系统重装了,burp还没来得及下,借用指南里的一张图)

有的时候xss触发可能还和浏览器有关,不同浏览器之间存在差距,并且代码作者可能作出一些限制,这也决定了xss能否成功

还有就是网站可能对html代码的输入做了限制,但可能并没过滤其编码形式,可以尝试用编码形式来绕过

补充阅读:https://www.owasp.org/index.php/Testing_for_Reflected_Cross_site_scripting_(OTG-INPVAL-001)

posted @ 2023-01-23 20:05  smile_2233  阅读(31)  评论(0编辑  收藏  举报