第7关 文件上传 ---面试官常问
1、MySQL上传shell的满足条件
如果面试官问你如何通过MySQL向网站上传一个shell脚本或者其他语言的一些脚本
---就可以通过outfile导出的方式进行上传;
outfile导出的前提条件:1、必须知道网站的物理路径;
---因为你要导出到网站那就必须知道网站的路径
2、必须拥有管理员权限;//上传文件就必须要管理员权限
3、secure_file_priv 不为 NULL ;
当值不为空,则必须要上传到着参数指定的路径下
2、secure_file_priv 参数
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能导出导入。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
--2、查看secure_file_priv 的命令
show global variables like '%secure_file_priv%';
第8关 ---布尔注入
前端直接只会显示一个是否已经进入的界面;
当后端的MySQL代码执行没有报错,或执之后的逻辑返回也是为真,那么就会显示你进入其中了;
当后端的MySQL代码被执行时,出现了报错,那么你的web前端将会显示什么也没有;
这就类似于布尔类型的显示
你要记住,这里的$row是被if给逻辑判断了的,当被正确执行或值为真就会进去;
我们查看后端代码,发现出现这种情况的无非就是因为这段代码--->
MySQL代码被执行就是这段代码实现的。这段代码即对MySQL代码进行执行了又对返回的结果进行处理了;
mysql_quer()才是执行MySQL的查询语句的
当MySQL代码被执行之后返回结果为真的时候就会进入这个if里面;
反之当MySQL代码被执行之后的返回结果为假或直接MySQL代码执行错误(执行错误肯定也算不上为真吧)就会不进入里面;
---所以我们就应该利用这个真假不同的来通过地址栏来执行一段MySQL代码,这个MySQL代码因为不会打印错误信息,所以我们就直接一个一个判断数据库的每个字符;
2、如何进行爆破出数据库名称
---1、通过地址栏,来直接输入一段MySQL的逻辑代码,让后端接收到的为真或假,然后后端在真的基础之后就会显示 东西1,在假的基础上就会显示 东西2,那么我们就可以知道我们的逻辑代码执行之后到底是真还是假;
所以我们这段逻辑代码就可以用来判断数据库的每个字符,一个一个推敲数据库的每个字符;
127.0.0.1/sqli-labs-master/Less-8/?id=1' and ascii(substr(database(),1,1))>114 --+
---当为真的时候,说明比ASCII114大,当为假的时候表示<114 or =114;
--就是这样就可以一个一个推出数据库的每个字符了;
---substr(str,start,long); 截取字符串,一个是起始位置,一个是长度;
当然我们这种获取数据库名称的方式适合任何显示具有布尔视图的网站!!!,包括我们的第5关;
---2、有没有发现如果我们真的在地址栏这里一个一个测试判定数据库的名字字符的话就会非常慢,所以我们尽量这种情况直接使用脚本;
---写脚本之前我们要先明白,我们的脚本不是被网站去调用,而是脚本来调用我们的网站,你想想网站怎么可能去主动调用我们的脚本嘛,肯定是脚本去访问我们的网站,然后一个一个去测试我们的数据库名称呀!
只要是布尔注入就可以使用时间盲注,之所以很多时候不用时间盲注,是因为时间盲注耗费的时间;
---那么时间盲注到底什么时候用最好?
请看下一关:
第9关,不管你有没有进入,就是不管你有没有登录成功,前端都会显示一样的界面 ---时间盲注
1、当我们的前端不管你有没有进入成功都是显示的同样的界面怎么办?
这种总不能还让我们通过页面的布尔类型来判断了吧;
对,这种肯定是不能通过页面布尔来判断,但是我们可以人为手工去创建一个布尔效果来;
如:手工造一个时间布尔!!
127.0.0.1/sqli-labs-master/Less-5/?id=1'
and if(ascii(substr(database(),1,1))>115,sleep(2),sleep(0))--+
当数据库的首字母ascll码>115网站就沉睡2秒,当<115就不沉睡;
注意sleep()是在if()里面的!
所以,从这里可以看出我们的当我们不管是真是假,我们的显示界面一样的话,我们就直接手动创建一个时间布尔;
可以看出这个时间布尔也是可以通过脚本实现的,且实现的方式和前面的页面显示布尔差不多;且可以通同一套逻辑来实现!!
----------->
我们的数据表该怎么求?
第10关 ---同第九关一个原理,只是闭合换成了')
第11关 ---从此关开始,后续都是使用的post传参;
此关和第一关类似,你怎么在url输入查询的就怎么在这里输入查询;post传参和get传参的逻辑没有区别,只是在注释的时候会有区别
但是注意:post传参注释会从--+变成#,原因请看末尾补充部分!
--使用联合查询即可
第12关 ---此关和第2关类似,只是在闭合的时候发生变化,从‘’变成()
使用联合查询即可
第13关 ---和第3关类似,当你输入的数据看不到真实的数据,但是会报错;
那么我们就可以直接使用报错函数updatexml进行强制执行sql语句,将查询出来的结果给爆出来;
对报错注入有疑惑不妨尝试看看这个博客------>
SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门-CSDN博客
第14关 ---和第4关类似,当然就肯定和第13关类似,也是会输出报错内容,只是闭合和第13关有区别;
所以还是可以使用updatexml(参数1,路径,参数2);路径必须合法,不能有特殊符号;
所以可以使用
--->concat('%7e',(select-group_concat(table_name)
from-information_schema.tables where table_schema=security))
第15关和第5关类似,直接使用时间盲注
---注意:不管是时间盲注还是updatexml通过路径错误来实现报错注入,他们都是可以执行查询语句的;因为后端的php代码会执行sql代码;
补充知识点:
1、var_dump($row) //使用php函数在屏幕上打印字典集合
2、url编码会把#进行其他转换,所以#传给数据库的时候,已经不是#了,所以就没有了注释的效果的了;
url的地址栏的数据必须是在ASCII码表上有的
详细可见以下博客
URL编码/解码详解
3、为什么要用--+,而不能用--空格;+的作用是什么
MySQL中多行注释是/* */
单行注释是:--空格和#
那么我们在url中传递MySQL的命令时,如果要注释一行的话,就不能写#,因为#是特殊字符,url中不允许出现这种,只能用%23来表示;
--可见上文;
能用%23表示后,在经过url编码之后就会变成#;
同时,我们传递参数也不能使用--空格,因为我们的url中空格/+经过编码之后就会变成+/空格
所以--空格在url中会被编码成--+,然后传递过去也就是--+;
当然如果你在url中写的是--+的话,那么经过url转换之后就会变成--空格;
多行注释是:/* */
---------------------------------我们只讲思路,不讲详细过程;
过程是背,思路是理解;
想要走多远,10%背+90%理解
祝你年薪百万,成绩辉煌!!!