测试环境

  • DongTai-Python-agent 版本号:v1.2.0
  • 支持 Python 框架:Flask
  • Python 3.8

NoSQL 注入漏洞

以 JavaScript 注入为例

JavaScript 注入是由允许执行数据内容中 JavaScript 的 NoSQL数据库所引起的。JavaScript 使得在数据引擎进行复杂事务和查询成为可能。传递 “不干净的用户输入” 到这些查询中,便可以注入任意 JavaScript 代码,这将导致非法的数据获取或篡改。

在测试前,我们先了解一下 $where 操作符。在 MongoDB 中,$where 操作符可以用来执行 JavaScript 代码,将 JavaScript 表达式的字符串或 JavaScript 函数作为查询语句的一部分。

以下为靶场代码,漏洞位于第七行的 where 位置:

(此处有空行)

# mongo sql find

defmongo_find():

ser = request.args

ifser:

sql_query = {"$where":"this.name == '%s'"% (ser.get('name',''),)}

else:

returnSerializerJsonResponse(None, 202,"params error")

client = dt_get_value("mongo_client")

db = client.test

db.drop_collection('user')

collection = db.user

user = {

"id":"10001",

"name":"Jordan",

"age":"20",

"gender":"male"

collection.insert_one(user)

u = collection.find_one(sql_query)

ifu:

returnSerializerJsonResponse(json.loads(json_util.dumps(u)))

else:

returnSerializerJsonResponse(status=201, msg="no data")

JavaScript 函数并不是编写 MongoDB 查询的可靠方法,除非绝对需要,否则强烈建议不要使用。eg:

db.users.find({ $where: "function(){return(this.username == 'a'; sleep(5000))}" })

但在 IAST 检测中,无需构造特殊的 payload,只需正常访问 API,便可检测出漏洞。

直接进行 API 请求测试

检测结果显示,存在 NoSQL 注入漏洞:

修复建议

切勿在用户输入中使用 where,mapReduce 或 group 运算符,因为这些运算符使攻击者能够注入 JavaScript,因此比其他运算符相比危险性更高。为了加强安全性,可在 mongod.conf 设置 javascriptEnabled 为 false 。

LDAP 注入漏洞

LDAP 注入是在利用用户引入的参数生成恶意 LDAP 查询后,通过构造 LDAP 过滤器来绕过访问控制,提升用户权限。在维持正常过滤器的情况下构造出 AND、OR 操作注入来获取敏感信息。

常用应用场景

  • AND 注入
  • OR 注入
  • 万能用户

洞态 IAST hook 了 Python-ldap 和 ldap3 两个库中搜索的方法,以下为靶场的 ldap3 代码:

defldap3_search():

username = request.args.get('username','')

password = request.args.get('password','')

ldap_srv = ldap3.Server("ldap://ldap:10389")

ldap_conn = ldap3.Connection(ldap_srv, user="cn=admin,dc=planetexpress,dc=com", password="GoodNewsEveryone",auto_bind=True)

search_filter ="(&(cn=%s)(userPassword=%s))"% (username, password)

exists = ldap_conn.search("dc=planetexpress,dc=com", search_filter)

if notexists:

return "403"

return "200"

在 username 和 password 的位置增加特殊字符过滤:

from ldap3.utils.conv import escape_filter_chars as ldap3_escape_filter_chars

(此处有空行)

username = ldap3_escape_filter_chars(username)

password = ldap3_escape_filter_chars(password)

使用 postman 进行测试:

返回200表示可以正常查出数据, 说明可以被注入。

Python-ldap 的使用方法:

defldap_search():

username = request.args.get('username','')

password = request.args.get('password','')

ldap_srv = ldap.initialize("ldap://ldap:10389")

ldap_srv.simple_bind_s("cn=admin,dc=planetexpress,dc=com","GoodNewsEveryone")

search_filter ="(&(cn=%s)(userPassword=%s))"% (username, password)

exists = ldap_srv.search_s("dc=planetexpress,dc=com", ldap.SCOPE_SUBTREE, search_filter)

if notexists:

return "403"

return "200"

在 username 和 password 的位置增加特殊字符过滤:

from ldap.filter import escape_filter_chars as ldap_escape_filter_chars

(此处有空行)

username = ldap_escape_filter_chars(username)

password = ldap_escape_filter_chars(password)

当前接口的测试方式和结果与 ldap3 一致,这里不做详细说明,可参考以上截图。

漏洞危害

  • 登录绕过
  • 权限提升
  • 信息泄露

修复建议

针对从外部获取的参数,增加特殊字符过滤,使用对应库的 escape_filter_chars 方法。

关于洞态 IAST

洞态 IAST 是全球首个开源 IAST,于2021年9月1日正式开源发布。洞态 IAST 专注于 DevSecOps,具备高检出率、低误报率、无脏数据的特点,帮助企业在应用上线前发现并解决安全风险。自开源发布以来,洞态 IAST 备受开源社区人员和企业的关注,包括工商银行、去哪儿、知乎、同程旅行、轻松筹等在内的近二百家企业均已成为洞态用户。

官网地址:http://dongtai.io