python 调用js --以owasp的一个题目为例

最近玩了一下owasp,碰到一个题目之前在ctf中也出过类似的题.做个记录有备无患.


Screenshot from 2018-05-19 10-04-23.png
Screenshot from 2018-05-19 10-04-41.png

题目第一步是要找到优惠码
看下源码在输入的地方有个验证优惠码的地方.接着找到这个验证函数所在的js文件.

Screenshot from 2018-05-19 10-04-48.png
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.


Screenshot from 2018-05-19 10-17-29.png

你可能感兴趣的:(python 调用js --以owasp的一个题目为例)