代码之家  ›  专栏  ›  技术社区  ›  svrist

脚本访问webgoat url?

  •  2
  • svrist  · 技术社区  · 16 年前

    我已经解决了几个关于一个实验室的问题。在其中一个练习中,我尝试使用带有urllib2的python脚本来执行自动“测试”,因此我不必手动使用ascii(substr(first_name,3,1))>97等。

    但是,尽管我在使用urllib2脚本(也就是f2、f3和f4)时尝试了不同的url,但我似乎得到了相同的页面。html都是基本的第一页,与在浏览器中访问它不同:

    import urllib2 
    import urllib
    import cookielib
    import sys
    
    
    myjar = cookielib.FileCookieJar("cookies.txt");
    
    cookieHandler = urllib2.HTTPCookieProcessor(myjar)
    
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    tlurl="http://localhost:8081/webgoat/attack"
    
    password_mgr.add_password(None,tlurl,user="guest",passwd="guest")
    authhandler = urllib2.HTTPBasicAuthHandler(password_mgr)
    opener = urllib2.build_opener(cookieHandler, authhandler)
    data = [('Connection','keep-alive'),('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; da; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7')]
    
    
    
    def write_f_to_f(fname,f):
        f1 = open(fname,"w")
        f1.write(f.read())
        f1.close()
    
    def gen_req(url,referer=None):
        req = urllib2.Request(url)
        print "url: %s"%url
        mydata = data
        if referer != None:
           mydata.append( ('Referer',referer) ) 
        [ req.add_header(k,v) for k,v in mydata ]
        return req
    
    
    sys.stdout.flush()
    url = "http://localhost:8081/webgoat/attack"
    req = gen_req(url)
    f = opener.open(req)
    write_f_to_f("f1.html",f)
    f.close()
    
    params = urllib.urlencode({'start':'Start WebGoat'})
    qs = urllib.urlencode( {'Screen':107, 'menu':1200 } )
    url = "http://localhost:8081/webgoat/attack"
    req = gen_req(url,url)
    f = opener.open(req, params)
    write_f_to_f("f2.html",f)
    f.close()
    
    ourl = url
    url = "http://localhost:8081/webgoat/attack?%s"%qs 
    req = gen_req(url,ourl)
    f = opener.open(req)
    write_f_to_f("f3.html",f)
    f.close()
    
    
    ourl = url
    url = "http://localhost:8081/webgoat/attack?%s"%qs
    req = gen_req(url,ourl)
    f = opener.open(req)
    write_f_to_f("f4.html",f)
    f.close()
    

    注:我把作业的答案写在“艰难的道路”上交了上来。现在我只想知道是什么样的机制阻止urllib脚本访问内容

    我试着用webgoat访问我的本地tomcat,webgoat控制台说:

    Sat Feb 13 12:31:14 CET 2010 | 127.0.0.1:127.0.0.1 | org.owasp.webgoat.session.ErrorScreen | [Screen=107,menu=1200]
    errorscreen createContent Error:null message:Invalid screen requested.  Try: http://localhost/WebGoat/attack
    - WebGoat: Sat Feb 13 12:31:14 CET 2010 | 127.0.0.1:127.0.0.1 | org.owasp.webgoat.session.ErrorScreen | [Screen=107,menu=1200]
    Sat Feb 13 12:31:14 CET 2010 | 127.0.0.1:127.0.0.1 | org.owasp.webgoat.session.ErrorScreen | [Screen=107,menu=1200]
    

    据我所知,这并不能真正帮助我。

    2 回复  |  直到 16 年前
        1
  •  2
  •   mantrapeze    16 年前

    正在检查用户代理吗?我必须为一个典型的浏览器指定一个用户代理才能通过这样的检查。您的“data”变量中列出了一个,但看起来您实际上并没有以任何方式应用它。

        2
  •  1
  •   svrist    16 年前

    呜呼! 发现了

    每次会话都会重新生成我要查找的页的ID。所以在选择屏幕ID之前,我需要查看返回的数据:

    import urllib2 
    import urllib
    import cookielib
    import re
    
    def write_f_to_f(fname,f):
        f1 = open(fname,"w")
        f1.write(f.read())
        f1.close()
    
    def gen_req(url,referer=None):
        req = urllib2.Request(url)
        return req
    
    
    
    myjar = cookielib.FileCookieJar("cookies.txt");
    cookieHandler = urllib2.HTTPCookieProcessor(myjar)
    
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    tlurl="http://127.0.0.1:8081/webgoat/attack"
    
    password_mgr.add_password(None,tlurl,user="guest",passwd="guest")
    find = "Blind Numeric."
    
    authhandler = urllib2.HTTPBasicAuthHandler(password_mgr)
    opener = urllib2.build_opener(authhandler,cookieHandler)
    
    url = "http://127.0.0.1:8081/webgoat/attack"
    req = gen_req(url,url)
    f = opener.open(req)# Setup session and login.
    
    params = urllib.urlencode({'start':'Start WebGoat'})
    url = "http://127.0.0.1:8081/webgoat/attack"
    req = gen_req(url,url)
    f = opener.open(req,params) # Submit the "Start" form
    dat = f.read() # Get the menu html from the firstpage.
    f.close()
    
    
    m = re.search("attack\?Screen=(\d+).*%s"%find,dat) # Try to find screen id for what i want
    if not m is None:
        scr= m.group(1)
        qs = urllib.urlencode( {'Screen':scr, 'menu':1200 } )
        ourl = url
        url = "http://127.0.0.1:8081/webgoat/attack?%s"%qs
        req = gen_req(url,ourl)
        f = opener.open(req)
        write_f_to_f("f4.html",f)
        f.close()
        print "Found the page and saved it to f4.html"
    else:
        print "Didnt find screen id for %s"%find