入门小白进阶SQL的文章
“SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中添加恶意语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。”
1.SQL注入介绍
1.1 SQL注入原理
前端构造的SQL语句片段拼接到后台SQL语句中,后台缺乏正确识别和过滤,造成与其外的数据库查询结果。在php中,一般会用$_GET[‘id’]或者$_POST[‘id’]来接收传入的id,通过GET获取了id参数的值,然后把id传给了那条数据库语句让它查询。
1.2 SQL注入危害
从技术上来说:未授权、非法增删改查数据库内容,包括窃取信息、删除数据库、读写系统文件、执行命令等等。
从影响上来说:客户数据丢失、系统交易数据被篡改、网站首页被篡改。
1.3 SQL注入分类
- 按照后台处理前端提交参数的类型来分,分两类:
- 数字型注入和字符型注入。
- 按照请求方式分:GET、POST
- 按照其他分类方法,还有一些常见数据库注入类型:报错注入、盲注、延时注入、宽字节注入、二次注入、堆叠注入。
2.SQL注入利用
2.1 利用步骤
联合查询>报错>布尔盲注>延时盲注
宽字节注入、二次注入(代码审计)
2.2 MySQL数据库
2.2.1 MySQL函数
1 | substr(var1, var2, var3) |
功能:从字符串里截取其中一段字符(串)
- var1:被截取的字符串
- var2:从哪一位开始截取
- var3:截取长度
1 | ascii(var) |
功能:取var字符的ascii码(十进制)
1 | if(var1,var2,var3) |
- var1: 条件
- var2:条件为真时返回的值
- var3:条件为假时返回的值
1 | sleep(var) |
功能:暂停执行var秒,var可以用小数
3.SQL注入挖掘
3.1 攻击思路
判断是否动态网站
找注入点
判断数字型、字符型
如果是字符型,则需要判断闭合符
- 如果尝试作为闭合符的字符是闭合符中的一个,那么会报错;
- 尝试多个输入点进行判断,尤其是要发掘新功能的输入点
- 如果尝试作为闭合符的字符并非是闭合符,那么它会被当成普通字符处理,不会报错(报错不等同于查询不出来);
后台SQL语句
掌握查询当前库名的函数database();
掌握判断闭合符的方法;
掌握information_schema库与SQL注入相关的用法;
掌握union查询及其条件;
掌握concat、concat_ws、group_concat的用法;
掌握双引号等特殊字符的查询,要用到转义符\;
3.2 SQL挖掘点
- 与数据库交互的页面,如:带xxx?id=xx
- 登录、更新、注册、留言板、验证等等
- 在数据包中可能出现的地方:http头、cookies、referer、user、agent、post提交数据包的地方等等。
3.3 注入点判断方法
单引号法:即直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,且浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。
1=1和1=2法:很多时候检测提交包含单引号的链接时,会提示非法字符,或者直接不返回任何信息,但这并不等于不存在SQL注入漏洞。此时可使用经典的“1=1和1=2”法进行检测。方法很简单,就是直接在链接地址后分别加上and 1=1和and 1=2进行提交,如果返回不同的页面,那么说明存在SQL注入漏洞。
4.SQL注入绕过
编码字符串
- char()
1 | 如:select(char(67,58,92,92,84,69,83,84,46,116,120,116)); |
- 16进制编码
1 | 如:0x633a2f77616d702f7777772f666c61672e747874 |
- hex
- unhex()
1 | 如:select convert(unhex(‘E698A5E79CA0’) using utf8); |
- to_base64(), from_base64():mysql 5.6后支持
1 | 过滤绕过: |