mirror of
https://github.com/github/codeql.git
synced 2025-12-21 03:06:31 +01:00
Python: Remove dummy clickhouse SQL injection query
This commit is contained in:
@@ -1,28 +0,0 @@
|
|||||||
from django.conf.urls import url
|
|
||||||
from clickhouse_driver import Client
|
|
||||||
from clickhouse_driver import connect
|
|
||||||
from aioch import Client as aiochClient
|
|
||||||
|
|
||||||
class MyClient(Client):
|
|
||||||
def dummy(self):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def show_user(request, username):
|
|
||||||
|
|
||||||
# BAD -- Untrusted user input is directly injected into the sql query using async library 'aioch'
|
|
||||||
aclient = aiochClient("localhost")
|
|
||||||
progress = await aclient.execute_with_progress("SELECT * FROM users WHERE username = '%s'" % username)
|
|
||||||
|
|
||||||
# BAD -- Untrusted user input is directly injected into the sql query using native client of library 'clickhouse_driver'
|
|
||||||
Client('localhost').execute("SELECT * FROM users WHERE username = '%s'" % username)
|
|
||||||
|
|
||||||
# GOOD -- query uses prepared statements
|
|
||||||
query = "SELECT * FROM users WHERE username = %(username)s"
|
|
||||||
Client('localhost').execute(query, {"username": username})
|
|
||||||
|
|
||||||
# BAD -- PEP249 interface
|
|
||||||
conn = connect('clickhouse://localhost')
|
|
||||||
cursor = conn.cursor()
|
|
||||||
cursor.execute("SELECT * FROM users WHERE username = '%s'" % username)
|
|
||||||
|
|
||||||
urlpatterns = [url(r'^users/(?P<username>[^/]+)$', show_user)]
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
<!DOCTYPE qhelp PUBLIC
|
|
||||||
"-//Semmle//qhelp//EN"
|
|
||||||
"qhelp.dtd">
|
|
||||||
<qhelp>
|
|
||||||
|
|
||||||
<overview>
|
|
||||||
<p>
|
|
||||||
If a database query (such as a SQL or NoSQL query) is built from
|
|
||||||
user-provided data without sufficient sanitization, a user
|
|
||||||
may be able to run malicious database queries.
|
|
||||||
</p>
|
|
||||||
</overview>
|
|
||||||
|
|
||||||
<recommendation>
|
|
||||||
<p>
|
|
||||||
Most database connector libraries offer a way of safely
|
|
||||||
embedding untrusted data into a query by means of query parameters
|
|
||||||
or prepared statements.
|
|
||||||
</p>
|
|
||||||
</recommendation>
|
|
||||||
|
|
||||||
<example>
|
|
||||||
<p>
|
|
||||||
In the following snippet, a user is fetched from a <code>ClickHouse</code> database
|
|
||||||
using five different queries. In the "BAD" cases the query is built directly from user-controlled data.
|
|
||||||
In the "GOOD" case the user-controlled data is safely embedded into the query by using query parameters.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the first case, the query executed via aioch Client. aioch - is a module
|
|
||||||
for asynchronous queries to database.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the second and third cases, the connection is established via `Client` class.
|
|
||||||
This class implement different method to execute a query.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the forth case, good pattern is presented. Query parameters are send through
|
|
||||||
second dict-like argument.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the fifth case, there is example of PEP249 interface usage.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the sixth case, there is custom Class usge which is a subclass of default Client.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<sample src="ClickHouseSQLInjection.py" />
|
|
||||||
</example>
|
|
||||||
|
|
||||||
<references>
|
|
||||||
<li>Wikipedia: <a href="https://en.wikipedia.org/wiki/SQL_injection">SQL injection</a>.</li>
|
|
||||||
<li>OWASP: <a href="https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html">SQL Injection Prevention Cheat Sheet</a>.</li>
|
|
||||||
</references>
|
|
||||||
</qhelp>
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* @id py/yandex/clickhouse-sql-injection
|
|
||||||
* @name Clickhouse SQL query built from user-controlled sources
|
|
||||||
* @description Building a SQL query from user-controlled sources is vulnerable to insertion of
|
|
||||||
* malicious SQL code by the user.
|
|
||||||
* @kind path-problem
|
|
||||||
* @problem.severity error
|
|
||||||
* @precision high
|
|
||||||
* @tags security
|
|
||||||
* external/cwe/cwe-089
|
|
||||||
* external/owasp/owasp-a1
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import experimental.semmle.python.frameworks.ClickHouseDriver
|
|
||||||
import semmle.python.security.dataflow.SqlInjection
|
|
||||||
import DataFlow::PathGraph
|
|
||||||
|
|
||||||
from SQLInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
|
|
||||||
where config.hasFlowPath(source, sink)
|
|
||||||
select sink.getNode(), source, sink, "This SQL query depends on $@.", source.getNode(),
|
|
||||||
"a user-provided value"
|
|
||||||
Reference in New Issue
Block a user