PyxYuYu/MyBlog

Python学习记录(四):编码问题&网络爬虫

PyxYuYu opened this issue · 0 comments

Enrich your life today, yesterday is history, tomorrow is mystery.

0x01 Wooyun

  • SQL注入
  • DNS域传送漏洞
  • Java 反序列化命令执行
  • 文件上传导致任意代码执行
    • 上传证件扫描处,利用Burpsuite抓包截断
  • 设计缺陷/逻辑错误
    • 任意用户密码重置一
      • 利用第一个正确的用户,重置密码,填入验证码并抓包,获得返回的信息,并记录
      • 重置另一个用户,验证码随便填写,提交抓包,将之前的返回信息替换这个包内的信息,手机号改为目标的手机号,发送这个包
      • 跑手机号,直接用Burpsuite选取一些常用段,跑后4位就行
    • 任意用户密码重置二
      • 点击获取验证码,抓包,将包内的他人手机,修改为自己的手机,发送这个包,填入自己获取的验证码,修改他人的密码
    • 任意用户重置密码三
      • 验证码为4位,并且没有错误次数限制,可用Burpsuite暴力破解
    • 任意用户重置密码四
      • session絮乱导致,先正常输入自己的手机号,获取验证码,点击下一步,停留在修改新密码页面,开另外一个窗口,输入目标手机,发送验证码,返回之前的修改密码出,修改密码,就成功修改了目标的密码
  • 未授权访问/权限绕过
    • 查看订单处,修改订单号可以遍历其他用户订单信息
  • Bash Shellshock ( Bash 远程代码执行)
  • 网络未授权访问
    • FortiGate防火墙存在SSH后门
0x02 爬虫实战一

  • Firebug 查看网络
    • 因为Python是利用urllib2.Request()发送一个请求,通过urllib2.urlopen()获得一个类文件对象,将这个对象.read()读取(或者传入BeautifulSoup()中读取)获得源码后,就可以根据这个源码进行分析
    • 利用Firebug的话,就需要查看网络,查看其中请求包返回的消息体,也就等同于上面对象.read()查看源码
  • 保存到文档 txt 文本时候遇到的编码问题
    • file.write(str),保存成txt文件,encode()
    • ASCIIUnicode是字符集,utf-8 是字符集的编码方式
    • utf-8Unicode字符集的一种编码方式
    • 如果不知道py文件的编码方式,程序默认按照ASCII字符集来解码,所以需要声明文件编码方式
      • 凡是在文件中出现中文或其他非ASCII字符的时候首先需要在文件头声明编码方式coding=utf-8
    • 需要导出到外部的字符串统一解码(decode)为Unicode字符后,再统一编码(encode)后输出
    • Linux默认是utf编码,Windows默认是gbk编码,网页也有自己的编码方式,Unicode作为中间编码,服务器先把网页解码成Unicode,然后编码成系统的编码输出到浏览器,很多网页源码上就有类似的提示信息 <meta charset="UTF-8">
    • Pycharm中控制台输出如果是UTF-8,也可以正常显示
    • BeautifulSoup默认输出到控制台都是按照UTF-8格式(也就是BeautifulSoup()返回的是一个utf-8格式的文档对象),但是.string需要输出到txt文档的时候,其实.stringNavigableString对象(可以认为是str的继承子类),是Unicode编码格式(字符串在Python中都是Unicode编码格式),.string输出到控制台时,BeatuifulSoup会自动将其转换成UTF-8格式
    • 编码问题补充知识一
    • 编码问题补充知识二
    • 编码问题补充知识三
    • 编码问题补充知识四
  • 两个for循环的逻辑
    • 通过第一个for循环找到一个POC名字和链接页,进入这个POC详细页,利用第二个for循环来输出具体内容,并保存
  • 公开POC页面一共有13页,如果读取第14页的话,又重新返回到第一页,这里需要设置个判断,如果和第一页相同的话,需要跳出
  • 添加命令行参数,可以分别保存txt,保存py两种状态
    • sys模块:包含了相关的,获得命令参数的功能
    • argparse模块:命令行选项和参数解析的模块
  • 替换字符串内容的2中方法
    • str.replace(a, b)b替换str中的a
    • 利用正则表达式:
import re
#制定替换规则,生成正则pattren
a = re.compile('[/\\\?\*<>]')
#利用正则表达式的sub函数,将str中需要替换的符号替换成c
b = a.sub(c, str)
  • 源码实现流程
# 过程源码:整合两个读取网页的过程,并且保存相应POC到txt文件
request_public = urllib2.Request(url_public)
# 伪装浏览器,添加User-Agent
request_public.add_header('User-Agent', user_agent)
response_public = urllib2.urlopen(request_public)
soup_public = BeautifulSoup(response_public.read(), 'html.parser')
full_text = soup_public.find_all(href=re.compile(r'poc'))
for each_public in full_text:
    print each_public.string
    # poc_list.append(each_public.string)
    url_vul = url_index + each_public.attrs['href']
    # vul_list.append(url_vul)
    request_vul = urllib2.Request(url_vul)
    request_vul.add_header('User-Agent', user_agent)
    response_vul = urllib2.urlopen(request_vul)
    soup_vul = BeautifulSoup(response_vul.read(), 'html.parser')
    # 分析源码
    # print soup_vul
    # vul_text = soup_vul.find_all('pre')
    # 仅输出代码
    vul_text = soup_vul.find_all('pre', class_="brush: python;")
    for each_vul in vul_text:
        print each_vul.string
        # 去除文件名中的'/',文件名不支持
        save_name = each_public.string.replace('/', '') + '.txt'
        # soup_vul是utf-8编码,beautifulsoup默认输出格式是utf-8
        # print soup_vul.original_encoding
        with open(save_name, 'a+') as f:
            # each_vul.string是一个NavigableString对象(可以认为是str的继承子类)
            # 和Unicode字符串相同,用unicode()可以转化成Unicode字符串,unicode编码
            # 输出到txt时候,需要编码成utf-8格式
            f.write(each_vul.string.encode('utf-8'))
            # f.write('\r\n')
0x03 一天总结

  • 爬虫基本功能实现,可爬完全部POC,多线程和命令行未添加
  • 编码问题需要继续理解