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 <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语句如下
接下来用联合查询爆出数据库具体内容

如图,这里为什么要用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码中代表冒号
浙公网安备 33010602011771号