sqli-labs-笔记1

Less-1 基于get的单引号字符型注入

1后加上单引号出现sql语句报错,说明没有过滤,查看源码发现确实没有任何过滤函数,源码如下

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// 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 "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}

?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

_er

从报错语句可以看出sql语句闭合方式是单引号闭合(去掉外层包裹的单引号,最外层的单引号是mysql_error()函数产生的)

 

 

知道sql语句的闭合方式后,可以用order by猜测字段数量(orber by后面加上数字表示按第几个字段进行排序,若超过查询的字段数量则报错)

报错的情况

 

 

正确的情况

 

 说明当前所在表的字段数量为3

--+表示注释后面的内容,注释后执行的sql语句如下

SELECT * FROM users WHERE id='1' order by 4--+' LIMIT 0,1
可以看到该注释语句注释了我们之前在id=1处添加的单引号及其后面的LIMIT 0,1(限制查询条数)
若没有该注释语句,则会报错,原因就是我们之前在id处添加了一个单引号破坏了正常的sql语句结构

 

 

接下来用联合查询爆出数据库具体内容

 

 如图,这里为什么要用id=-1',原因是在该程序中,union的查询结果只会显示一个,id=-1这个值在数据表中不存在,第一个sql语句没有返回结果才会让第二个sql返回的结果显示在程序中

 

 如图,只会返回id=1的结果

 

接着用union爆出当前数据库名称security

 

 接着用union语句爆出数据库的表名

 

 

information_schema是mysql的一个元数据库,其中包含了mysql中的所有数据库的名称和其之下的表的具体名称,该条语句即是从information_schema下的tables表中查询数据库名为security的各个表的名称,group_concat()函数为mysql内置函数,用于将与相匹配的字段值拼接成一个字符串,若不用该函数,则只会输出第一个结果(程序限制)即emails

 

 注意这里最后语句结束不需加入分号,因为这是在程序中输入拼接到后端sql语句中,后端sql语句自带分号

知道了数据库中的表名后,进一步获取users表的字段名

 

 columns表用于存储mysql所有表的字段类型

接下来查看用户名和密码

 

 0x3a在ascii码中代表冒号

posted @ 2022-10-22 23:03  unknown27  阅读(38)  评论(0)    收藏  举报