最近重新学习了sql注入的一些相关的知识,对于之前的一些初学的时候的细节有了一些补充。
成因问题
sql注入的成因,其本质上是来自于未过滤的用户输入和不正确的sql代码拼接和执行。
环境来源
简单的sql注入会有一个报错的显示,对于这个报错之前一直不太清楚。
其来源是来源于,各个后端语言的数据库错误报错函数。
典型的在php种就是mysql_error()函数。
报错函数会收集所有的数据库错误返回给web服务器。
其原因主要是由于web服务器和数据库服务器处在不同的位置,之间的交互需要一些特定的方式去完成。
sql注入在测试的时候使用的'(单引号)搭建的语法错误报错本质上会被定为502或者是302报错,常见出现这些错误的时候都会被定向到自定义的错误界面。
在进行sql注入探测的时候应该关注这些特殊的web服务器状态,这种特殊的状态代表着我们对web服务器确实产生了一定的影响,往往漏洞就在这些特殊的影响效果之中。
人为构造判断条件
常见的人为构造判断条件也有一些特殊的小知识
' or 1=1#
这个语句会构建一个永真条件,对于永真条件sql数据库的判断是比较特殊的。
数据库理论上会返回所有的值给web服务器,等效于从数据库中抽去了所有的东西,如果数据库含有百万条信息,对网络的影响是非常大的。
条件构造的特殊情况
select 'or 1=1 from user union select pasw from paw
当出现如下sql的查询语句的时候,判断条件是没有意义的,无论判断如何都会产生数据的筛选值。
这里就涉及到注释符号#的使用
url编码细则
当 URL 路径,或者查询参数中带有中文、特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符(即没有特殊用途或者特殊意义的字符)去表示那些不安全的字符。
URL基本组成
一个 URL 的基本组件包括协议、域名、端口号、路径和查询字符串,其中路径和查询字符串之间使用问号?隔离,示例如下:
http://www.biancheng.net/index?param=10
其中域名为 http://www.biancheng.net,路径为 index,查询字符串为 param=1。
URL 中规定了一些字符(:/ ? # [ ] @)用来分隔不同的 URL 组件,这些字符被称为保留字符。例如:
冒号:用于分隔协议和主机组件,斜杠用于分隔主机和路径
问号:用于分隔路径和查询参数等。
还有一些保留字符(! $ & * + , ; =)起到分割 URL 不同组件的作用,比如:
=用于表示查询参数中的键值对
&符号用于分隔查询多个键值对。
哪些字符需要编码
URL 编码协议规定(即 RFC3986 协议):URL 中只允许包含英文字母、数字、以及这 4 个 - _ . ~ 特殊字符和所有的保留字符。协议中规定了以下保留字符:
! * ’ ( ) ; : @ & = + $ , / ? # [ ]
但是当组件中的普通数据包含这些特殊字符时,它们就变成了不安全字符,此时就需要对其进行编码处理。比如查询字符串中包含了特殊字符:
http://www.biancheng.net/index?param=10*¶m1=20*
为了让符需要编码。主要分为以下三种情况:
ASCII 表中没有对应可显示字符的,例如汉字。
不安全字符,包括:# ”% <> [] {} | \ ^ ` ~ 。
不当做保留字符来使用的保留字符,即& / : ; = ? @ 。