如何利用python教程判断一个 IP 在不在线?
假设今天老板给我们一个任务,让我们判断一下一个 IP 在不在线。我们随手用 python 写一个 ping IP 的代码:
import os
host = input('请输入要检测的 IP : ')
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result:
print('IP 在线')
else:
print('IP 不在线')

现在,你作为一名审核代码的人员,不考虑代码整体结构问题,不考虑为什么写这段代码的程序员用ping,用popen,你能看出什么问题吗?
如果看不出的话,想两个问题:
- popen 的本质是什么?如果你不知道或者没有用过popen,试着不要去查,猜一下这个函数的作用。
- 在这段程序中,popen 要执行的命令是什么?
既然 popen 后面执行的语句中的 host 变量是由用户输入的,那恶意用户是不是可以输入一个localhost && whoami 呢?这样 popen 执行的代码就变成了 ping -c 1 -t 1 localhost && whoami。注意,就算上述例子中没有将运行结果直接打印出来,但没打印出来并不代表代码没有运行。例如如果我直接输入 host 为 localhost && whoami的话,输出结果还是 IP 存在, 但这并不代表 whoami 命令没有运行,我们依旧可以建立一个 Reverse Shell。为了验证结果,我们在代码里面让 result 被打印出来。

这一项技巧叫做 命令注入(Command Injection),普通的程序员如果不是遇到了这类问题,应该是不会接触到这项技巧的,看见上面的漏洞代码也会觉得没什么问题,最多觉得有点不顺眼,但能第一时间反应出有安全漏洞的是占少数的。
这项技巧听起来好像很简单,比逆向,提权那些简单很多,但这项技巧是富有创造性的,下限很低,上限很高。
比如我们现在知道了存在上面这个问题,那么在输入阶段把一些关键字过滤一下总可以了吧。在这个问题中,我们想让用户输入的是一个 IP ,那就直接过滤掉空格吧,正常 IP 里面总不可能有空格吧。
再把 &, ;, -,||,| 也过滤掉吧,万无一失。
import os
host = input('请输入要检测的 IP : ')
forbidden = ['&', ';', '-', ' ', '||', '|'] for i in forbidden: if i in host: print('Catch you') exit()
result = os.popen('ping -c 1 -t 1 %s' % (host)).read()
if 'ttl' in result: print('IP 在线') else: print('IP 不在线')
真的万无一失吗?
我们在 /tmp 目录下新建一个 exp.sh, 在里面输入我们想执行的命令,在这个例子中我们输入 whoami。然后 chmod +x exp.sh 赋予执行权限,再通过 $(./exp.sh) 就可以绕过黑名单过滤了。
这是一个非常简单的例子,但却可以说明黑客比程序员高在什么地方。我认为高在对漏洞的敏感程度和创造力上。提高漏洞的敏感程度需要花大量的时间在 CVE ,黑客论坛等地方,而提高创造力则完全只能靠天赋和运气了。
也许你会觉得对于上面这个例子,你有很多种办法可以避免。首先我承认这个例子是我临时想的,很不好,但也请注意我的这个例子非常简单且不成熟。在现实的红蓝战场上,以 SQL 注入为例,都那么多年了,能完全避免的了吗?记得今年年初暗网暴露的 Collection 数据库集合,1000g 的各种被注入的数据库,涉及全球各种论坛,甚至包括某些银行,某些人口统计局,某些政府机构。代码思路是有限的,创造力是无限的。
如何利用python教程判断一个 IP 在不在线?的更多相关文章
- 判断一个IP地址是否是本局域网内地址
// /// <summary> /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false, /// </summa ...
- python实现判断一个字符串是否是合法IP地址
#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...
- Python 如何判断一个函数是generator函数?
如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断: >>>from inspect import isgenerat ...
- 利用Python脚本完成一个Fat-tree型的拓扑
利用Python脚本完成如下图所示的一个Fat-tree型的拓扑(交换机和主机名需与图中一致,即s1~s6,h1~h8) 参考资料 修改代码如下: from mininet.topo import T ...
- python 实现判断一个用户输入字符串是否是小数的小程序
要判断一个字符串是否是小数:1先判断小数点的个数,即如果是小数,则必须有且仅有一个'.'号2再分别判断'.'号的左右两边是否是数字: 判断左边时,如果负数,则左边包含'-'号:必须以'-'号开头(校验 ...
- python如何判断一个字符串是中文,还是英文。
参考链接: https://blog.csdn.net/hit0803107/article/details/52885702 decode: 将其它编码转成 ===>unicode enc ...
- 利用python+tkinter开发一个点名软件
最近上课学生多名字记不住,名册忘记了带,要点名怎么办,好久没有写代码了,于是自己写了个点名软件,记录下吧,第一次接触TK也不是太熟悉,写的不太好,记录下源代码 以后遇到要写桌面软件还是可以耍耍的. t ...
- 利用python+tkinter做一个简单的智能电视遥控器
要通过python实现遥控器功能分两步: 第一步:开发图形化界面,以暴风TV的遥控器按钮为例 第二步:使PC端给电视发送相应指令(此步骤需要打开电视的adb开关) 现在就开始第一步操作实现遥控器功能, ...
- Python中判断一个中文是否中文数字的方法
Python内置功能非常强大,在字符串内置函数中提供了一个判断字符串是否全数字的方法,而且这个方法不只是简单判断阿拉伯数字,包括中文数字和全角的阿拉伯数字都认识,这个函数就是字符串的isnumeric ...
随机推荐
- 🐯 php项目中类的自动加载
主要函数:spl_autoload_register() — 注册给定的函数作为 __autoload() 的实现 将函数注册到SPL __autoload函数队列中.如果该队列中的函数尚未激活,则激 ...
- java上传文件类型检测
在进行文件上传时,特别是向普通用户开放文件上传功能时,需要对上传文件的格式进行控制,以防止黑客将病毒脚本上传.单纯的将文件名的类型进行截取的方式非常容易遭到破解,上传者只需要将病毒改换文件名便可以完成 ...
- 【C/C++开发】C++11的模板类型判断——std::is_same和std::decay
C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是 ...
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要: 目前ONVIF协议家族设备已占据数字监控行业 ...
- Linux安装zookeeper3.5.6
依赖JRE[我这边是JRE8] 一,先在https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/下载apache-zookeeper- ...
- 全网最详细的Windows里Git client客户端管理工具SourceTree的下载与安装(图文详解)
不多说,直接上干货! 很多人用Git命令行不熟练,那么可以尝试使用SourceTree进行操作. 安装之前的必备 (1)Git的安装 Git学习系列之Windows上安装Git详细步骤(图文详解 ...
- [转帖]超能课堂(207) SD卡标准错综复杂,到底该认哪一个?
超能课堂(207)SD卡标准错综复杂,到底该认哪一个? https://www.expreview.com/71505.html 开始的地方 SD容量等级 SD标准(SDSC) SDHC SDXC S ...
- sqlite 安装与编译
本文简述了SQLite的概念,并详细描述了SQLite在Linux和Windows平台下的编译方法 关于 SQLite SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 ...
- 【题解】Luogu P5288 [HNOI2019]多边形
原题传送门 HN的题目就是毒瘤 我们有以下猜想: 1.最后所有的线都连到了n号点上 2.最小步数应该为n-3-已经连到n号点的线段数量 本来有些边\((a_i,n)\)会将整个图分割成很多个区间.对于 ...
- GoLang基础数据类型---字典
Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:make(map[Key ...