SQL注入之报错注入

报错注入中,页面没有显示位,但会输出SQL语句执行错误信息,SQL报错注入就是人为利用数据库的某些机制,人为制造错误条件,使得查询结果能够出现在错误信息中,以xpath语法错误为例

Xpath语法错误主要涉及两个函数

(1)updatexml( )

(2)extractvalue( )

Updatexml语法格式(XML_document,XPATH_string,new_value)

第一个参数:xml文档的名称

第二个参数:xpath格式的字符串

第三个参数:替换查找到的符合条件的数据

1.判断是否存在注入

如果能引起数据库的报错,说明用户是可以对查询语句进行修改,说明存在漏洞

2.判断注入类型

通过1' and  1=1#和1' and  1=2#判断,若页面有不同的变化,则是字符型注入

页面不同,故为字符型注入

3.获取数据库名

此处便使用到了updatexml语法,可为什么不直接用updatexml(1,database(),1)来查询数据库名呢,而要加入concat函数,首先回到语法格式上:updatexml(XML_document,Xpath_string, new_value),我们必须在XPath_string这个参数里填充xpath格式的字符串,但是如果我们填充一个不是xpath格式的字符串,就会产生报错,所以语句就变成了updatexml(1,database( ),1),前后两个1是随便填充的内容,目的是满足三个参数。但是由于xpath只会对特殊字符进行报错,这里我们可以用~,16进制的0x7e来进行利用,所以就变成了updatexml(1,0x7edatabase00x7e,1),但是由于数据库无法认识中间的内容,所以就无法成功执行,所以可以用concat0函数把多个字符串合并成一个,就变成了updatexml(1,concat(0x7edatabase0,0x7e)1)

4.获取数据库表名

查询语句要带括号,因为concat函数中不能有空格,需要用括号将其变成整体

5.获取表中的字段

6.获取字段中的记录

由于xpath只会报错32个字符,故使用substr()函数进行截取,若想截取后续内容,改变1,32的值即可

### SQL注入报错的原因分析与解决方案 #### 一、SQL注入报错原因 SQL注入过程中出现的报错通常是因为输入的数据破坏了原始SQL语句的语法结构,或者触发了数据库的安全机制。以下是常见的几种报错场景及其成因: 1. **语法错误** 当攻击者尝试通过拼接恶意字符串来修改SQL查询逻辑时,可能会导致SQL语句无法正常解析而引发语法错误。例如,在`sqli-labs`的第一关中,如果仅闭合单引号而不处理后续部分,则可能导致前端页面显示类似“syntax error”的提示[^2]。 2. **权限不足** 数据库操作可能涉及特定用户的访问控制策略。当执行某些敏感命令(如读取文件或调用系统函数)时,若当前账户缺乏相应权限,也会抛出异常信息。 3. **防御措施生效** 现代Web应用往往配备多种防护手段对抗SQL注入威胁,比如WAF(Web Application Firewall),它能够识别并拦截可疑请求;另外还有参数化查询等编程层面的最佳实践可以有效规避此类漏洞的发生。 4. **数据类型冲突** 如果注入点预期接收整数型参数却收到字符型输入,那么转换失败同样会造成运行期崩溃现象。 #### 二、解决SQL注入报错的方法 针对上述提到的各种情形,下面列举了一些通用的技术应对办法: 1. **调整测试载荷(Payload)** 对于简单的语法问题,可以通过精心设计payload使得最终形成的完整query既满足业务需求又能绕过初步筛查。举个例子来说就是采用编码技术隐藏特殊符号的真实含义直到被目标引擎解读为止。 2. **利用条件判断代替直接输出** 考虑到有些场合不允许看到确切的error message,此时可改用布尔盲注法或者其他间接方式获取所需情报而不是依赖显式的fault report. 3. **借助工具自动化探索过程** 使用像SQLMap这样的开源软件可以帮助快速定位潜在风险区域以及自动适应不同的环境配置从而减少手动调试的工作量。假如遇到Windows平台上关于SQLMap本身的setup难题的话,按照官方文档指示逐步排查直至成功部署也是必要的步骤之一[^3]. 4. **增强应用程序安全性建议** - 实施严格的输入验证流程确保所有外部传入的数据都经过适当过滤后再参与内部运算。 - 推荐始终优先选用预编译语句而非动态组装string形式的commands. - 定期审查源码查找任何可能成为突破口的位置加以修正完善。 ```python import pymysql.cursors connection = pymysql.connect(host='localhost', user='user', password='passwd', database='db', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: sql = "SELECT * FROM users WHERE username=%s AND password=MD5(%s)" cursor.execute(sql, ('admin', 'password')) # 参数绑定防止SQL Injection finally: connection.close() ``` 以上代码片段展示了如何安全地构建SQL查询以防范传统意义上的injection attack。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值