来源:在做nc签到时,底层用了python黑名单过滤,这里进行一个复现
过程
import os
if __name__=="__main__":
blacklist=['cat','ls','cd','echo','<','>','${IFS}']
while True:
command = input("what do you want:")
for i in blacklist:
if i in command:
exit(0)
os.system(command)
然后在cmd窗口打开:
这里就成功运行了一个python黑名单脚本,不过最好是在linux。
system函数很危险,是我们的最爱。
注意:
1.程序入口
在Python中,`__name__` 是一个内置变量,它用于区分当前模块是被直接运行还是被导入到其他模块中。当Python文件被直接运行时,该文件被视为程序的入口点,此时 `__name__` 的值会被设置为 `"__main__"`。相反,如果该文件被导入到其他模块中,则 `__name__` 的值会是该文件的模块名。
例:
在python文件夹下创建一个包,并编写自己的模块(注意避免使用数字开头!最好小写字母加下划线)
moudle1:
def my_fun():
print("this is a function inside the modle.")
class myclass:
def __init__(self):
print("this is a class inside the moudle.")
if __name__ == "__main__":
print("this moudle is being run directly.")
my_fun()
my_instace = myclass
else:
print("this moudle is being imported.")
moudle2:
import moudle1
moudle1.my_fun()
moudle1.myclass
运行出现各自的结果。
再介绍其他导入包的方式:
相对导入:
# 假设当前文件是 package/module1.py,想要导入同一包下的module2.py
from . import module2# 从上一层包中导入模块
from .. import module3# 从顶层包中导入模块
from .package import module4
导入选择内容:
from math import * //全部导入,不建议
from math import sqrt //选择性导入,建议
print(sqrt(16)) # 直接使用sqrt函数
__name__="__main__"这种方式使得模块既可以作为独立的程序运行,也可以作为库被其他程序导入使用。
2.绕过方式
管道符绕过:(部分)
windows
& 前后都要执行,无论真假
| 直接执行后面语句
linux
; 前后都要执行
空格过滤:
${IFS}
$IFS$9
%09 php环境
<
<> 重定向
绕过原理我也不太清楚,在cmd试了 也不行,应该在linux或者system()函数下的识别有关
反斜杠绕过
cat == ca/t
编码绕过
还有很多绕过方式,但原理都不大懂,就不再赘述,以后一定会专门讲绕过。
tip:对于csdn图片上传问题,我的菜鸟解决方法是把截屏的文件放到桌面blog文件夹下,使用时直接打开拖拽就行了。