最近玩了一下owasp,碰到一个题目之前在ctf中也出过类似的题.做个记录有备无患.
题目第一步是要找到优惠码
看下源码在输入的地方有个验证优惠码的地方.接着找到这个验证函数所在的js文件.
var coupons = ["nvojubmq",
"emph",
"sfwmjt",
"faopsc",
"fopttfsq",
"pxuttfsq"];
function isValidCoupon(coupon) {
coupon = coupon.toUpperCase();
for(var i=0; i= 0;i--){
for (j = 0;j
可以看到在这个地方函数isValidCoupon() 的参数coupon就是输入的优惠码,然后他是将coupon转成大写然后跟coupons里的coupon(这个在js的最开始就有)经过decrypt后的结果进行比较.
function isValidCoupon(coupon) {
coupon = coupon.toUpperCase();
for(var i=0; i
然后看decrypt()函数
function decrypt(code){
code = code.toUpperCase();
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
caesar = '';
for (i = code.length ;i >= 0;i--){
for (j = 0;j
似乎就是caesar密码.但我在这里没有对程序进行进一步的阅读.
还是先看python代码吧
payload.py
import execjs
def get_js():
f = open('clientSideValidation.js','r')
line = f.readline()
htmlstr = ''
while line:
htmlstr += line
line = f.readline()
return htmlstr
def Call_decrypt(code):
jsfile = get_js()
ctx = execjs.compile(jsfile)
return (ctx.call('decrypt',code))
def main():
decrypted = ''
coupons = ["nvojubmq", "emph", "sfwmjt", "faopsc", "fopttfsq", "pxuttfsq"];
print(len(coupons))
for coupon in coupons:
decrypted = Call_decrypt(coupon)
print(decrypted)
if __name__ == '__main__':
main()
整个代码的逻辑还是很简单的
就是将coupons里的coupon一个一个的通过调用js里的decrypt()函数得到结果然后将结果输出.结果肯定能得到我们要在页面输入的coupon.