SQL,DLL,XML和LDAP

SQL和SQL注入 #

SQL(Structured Query Language)是一种用来管理查询 关系型数据库的语言,允许用户定义、操作和控制数据库系统中的数据。它经常被用来执行数据库操作,比如创建和管理数据库、定义表和表之间的关系、插入,更改或删除数据、查询数据。

SQL注入是指在SQL查询中插入恶意SQL代码,从而绕过认证、获取信息或修改数据库。

示例:

某网站使用如下代码验证登陆

SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';

如果用户在用户名栏输入 admin’ OR ‘1’=‘1’; –

SELECT * FROM users WHERE username = 'admin' OR '1'='1'; --' AND password = '';

;后的内容会被无视,导致返回所有用户信息,因为条件中的或门1=1始终为真。

**防范方法:**使用参数化查询或者预编译语句,确保用户输入在执行SQL语句时被当作数据而不是代码处理。Input Validation可以有效防范SQL注入。


DLL和DLL注入 #

DLL(Dynamic Link Library)是动态链接库,包含了可以被多个程序调用的代码和数据,在Windows系统中尤为重要。在安装软件时出现无法执行的情况,有时可以用更新对应.dll文件修复问题。常见库有kernel32.dll、user32.dll、Comdlg32.dll等。DLL库等好处在于不同应用程序可以调用同一个DLL,这样就不用重复储存相同的代码,节省资源。

DLL注入就是将恶意DLL文件加载到目标进程的地址空间中。这个可以通过多种手段实现,比如注入工具、注入代码或者其他的系统工具。一旦该恶意DLL被注入进了目标进程,就会执行代码,攻击者可以通过DLL执行各种操作,比如监视、篡改内存、拦截函数调用、记录键盘等待。

**防范方式:**采用代码签名,使用最新的安全措施和防护软件,以确保动态链接库(DLL)文件的完整性和合法性,防止被替换或滥用。


XML和XML注入 #

XML(eXtensible Markup Language)是一种标记语言,长得和HTML有点像,因为二者都是标记语言。区别在于HTML用于构建web页面和内容,用于前端页面交互,而XML用于数据交换和储存,描述数据结构而不是呈现方式。XML有明确定义的文档结构,包括元素、属性和文本内容。与容错性较高的HTML不同,XML文档必须是良构的,否则将会引发错误。

XML注入是通过在应用程序处理XML数据时插入恶意XML代码,来进行未经授权的操作。

示例:

某应用程序从XML文件中提取用户数据:

<user>
    <username>输入的用户名</username>
    <password>输入的密码</password>
</user>

如果用户输入的密码是 </password><admin>true</admin><password>,则XML解析器可能会误解用户的输入,将<admin>元素作为有效元素处理。

关于XML具体如何工作,请见Testing for XML Injection

**防范方法:**Input Validation可以有效防止XML注入。


因为经常搞混XML和XSS,这里附注一下XSS的工作方式:

XSS攻击 #

XSS(Cross-Site Scripting)为跨站脚本攻击,使用web应用注入恶意脚本,使其在用户的浏览器上执行,可以用来盗取用户的session、敏感信息等,还可以在用户界面上执行恶意操作。常见的XSS攻击包括在输入字段、URL参数或者cookie中插入恶意脚本,当用户访问包含这些脚本的页面时,脚本会在浏览器上执行。

XSS、分为存储型(将恶意脚本存储在服务器上,然后在页面上显示给用户)、反射型(将恶意脚本包含在URL中,用户点击包含脚本的链接时触发)和DOM-based(通过修改页面的DOM结构触发)等类型。

**防范方法:**Input Validation可以有效防止XSS注入。

XSS和XML的区别:

  • 攻击目标: XSS攻击的目标是用户的浏览器,而XML注入攻击的目标是XML解析器。
  • 数据类型: XSS攻击涉及HTML和JavaScript,而XML注入涉及XML数据。
  • 攻击向量: XSS攻击通常利用用户输入中的脚本,而XML注入则是通过插入恶意XML结构来攻击XML解析器。

**共同点:**都可以被Input Validation防止。


LDAP和LDAP注入 #

LDAP(Lightweight Directory Access Protocol)是一种开放标准协议,用于访问和维护分布式目录信息服务。常见用途为身份验证,储存用户名和密码,其储存方式为目录层次结构化,和SQL的表哥化不同。在Docker、Krbernetes、OpenVPN中可以用到。

LDAP注入通过在LDAP查询中插入恶意代码来绕过认证、获取敏感信息或者篡改目录数据。

*LDAP使用端口389

示例:

(&(username=输入的用户名)(password=输入的密码))

如果用户输入的用户名是 *)(cn=*))(|(cn=*,则查询可能变成:

(&(username=*)(cn=*))(|(cn=*)(password=输入的密码))

可能导致绕过身份认证。

**防范方法:**使用参数化LDAP查询+Input Validation;以及采用严格的访问控制策略,确保只有授权用户能够执行LDAP查询。


附赠一个Chatgpt的expain it like I’m five版:

· SQL(Structured Query Language):
   - 是什么: 就像问电脑问题的语言一样,我们可以告诉电脑去找、存储、或者改变一些数据。
   - 比喻: 就像给电脑写一张查找清单,告诉它我们需要的是什么数据。
   SQL注入:
   - 问题: 想象你告诉电脑一些东西,但是坏人把一些奇怪的东西放进去,让电脑做了不应该做的事情。
   - 比喻: 就像你告诉玩具盒要找到你喜欢的玩具,但是坏人在你的要求中放了一些奇怪的东西,结果你找到了不该找的玩具。

· DLL(Dynamic Link Library):
   - 是什么: 好比一个魔法盒子,里面有许多有用的东西,其他程序可以借用。
   - 比喻: 想象你有一个玩具盒,里面有各种各样的玩具,其他小伙伴也可以来借你的玩具。
   DLL注入:
   - 问题: 想象你有一个魔法盒子,里面有各种有用的东西,但坏人把一些不好的东西放进去,结果其他人借用盒子时会遇到问题。
   - 比喻: 就像你的玩具盒里有各种玩具,但坏人把一些坏玩具放进去,结果其他小伙伴借用你的盒子时会弄到一些坏东西。

· XML(eXtensible Markup Language):
   - 是什么: 就像一个信息传递的特殊语言,可以帮助电脑更好地理解和处理结构化的信息。
   - 比喻: 想象你有一种秘密语言,可以用来告诉你的朋友一些特殊的事情,而其他人不容易理解。
   XML注入:
   - 问题: 想象你用一种特殊的语言告诉电脑一些事情,但坏人在语言中加入了一些奇怪的东西,让电脑误解了你的意思。
   - 比喻: 就像你用一种秘密语言告诉朋友你的计划,但是坏人在语言中添加了一些混淆的东西,结果朋友弄错了你的计划。

· LDAP(Lightweight Directory Access Protocol):
   - 是什么: 就像一个大目录,里面有很多关于人、组织和其他东西的信息,可以方便地查找。
   - 比喻: 想象你有一个巨大的通讯录,里面有关于朋友、家人和其他人的联系方式和信息。
   LDAP注入:
   - 问题: 想象你有一个大目录,里面有很多人和组织的信息,但坏人在里面添加了一些虚假的信息,导致目录混乱。
   - 比喻: 就像你有一个通讯录,里面有关于朋友和家人的信息,但坏人在里面添加了一些不真实的信息,结果你找到的信息可能是错误的。

区别:
- SQL是一种语言,用于操作数据库。
- DLL是一个魔法盒子,里面有其他程序可以借用的功能。
- XML是一种信息传递的语言,用于让电脑更好地理解数据。
- LDAP是一个大目录,包含了有关人和组织的信息,可以方便地查找。

总结:
- SQL注入就像告诉电脑一些事情,但坏人混进了一些奇怪的东西。
- XML注入就像用一种特殊的语言告诉电脑一些事情,但坏人在语言中加入了一些混淆的东西。
- DLL注入就像有一个魔法盒子,坏人把一些不好的东西放进去,导致其他人使用盒子时遇到问题。
- LDAP注入就像有一个大目录,坏人在里面添加了一些虚假的信息,导致目录混乱。