Python代码审计中的SQL和ORM注入是怎样的

介绍

本篇文章为大家展示了Python代码审计中的SQL和ORM注入是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成。目前Python代码审计思路,呈现分散和多样的趋势.Python微薄研发经验以及结合实际遇到的思路和技巧进行总结。

<强> SQL注入和ORM注入

这两者注入相似度较高,所以打算放在一起分析和总结。它们所用原理OWASP前十名,中的描述非常合适,“将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入,NoSQL注入,OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。”。

<强> 1。SQL注入

Python  中常见存在风险SQL语句,在id或者Name可控的情况下存在安全隐患。可控参数可以将咱么期望他执行的代码按照语法进行拼接,从而执行原本预期之外的代码。

sql = "select id,name from user_table where id = %s and name = %s" % (id, name) cur.execute(sql)

然而在实际案例中,这种执行SQL语句并不多,比较典型的案例。实例代码如下:

import urllib import MySQLdb import SocketServer from SimpleHTTPServer import SimpleHTTPRequestHandler class MyHandler(SimpleHTTPRequestHandler):     def _set_headers(self):         self.send_response(200)         self.send_header('Content-type', 'text/html')         self.end_headers()     def do_GET(self):         print("got get request %s" % (self.path))         hql = urllib.splitquery(self.path)[1]         uri_c = str(hql)         print('cmd===%s' % (uri_c))         sql = "select id from user_table where id = %s" % uri_c         db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8')         cursor = db.cursor()         cursor.execute(sql)         data = cursor.fetchone()         self.wfile.write(data) def start_server():     httpd = SocketServer.TCPServer(("127.0.0.1", 8090), MyHandler)     print('Starting httpd...')     httpd.serve_forever() if __name__ == "__main__":     start_server()

这是一个简单的HTTP服务器,目前在Python2中可以正常运行。通过urllib.splitquery获取得到请求的参数,uri_c,里面为请求参数的值。用值传递到SQL语句中拼接,从而产生注入问题。这是比较简单的一种,正常情况下调用链可能会比较长,长短取决于平台的设计架构。

<强> 2。ORM注入

(1) sqlalchemy ORM注入(cnvd - 2019 - 17301)

考虑到的理解上比较容易,用模块进行举例,并不涉及到框架.ORM注入是SQL注入的一种特殊情况,ORM模块将SQL语句进行模板化,所以找SQL语句字符串的办法不好用了。那么应该怎么办?null

Python代码审计中的SQL和ORM注入是怎样的