面试题:SQL注入漏洞总结
1. 如何突破注入时字符被转义:
宽字符注入、hex 编码绕过。
2. SQL注入防护方法:
1. 使用安全的API
2. 对输入的特殊字符进行Escape转义处理
3. 使用白名单来规范化输入验证方法
4. 对客户端输入进行控制,不允许输入SQL注入相关的特殊字符
5. 服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。
5. 规范编码、字符集。
3. 为什么参数化查询可以防止SQL注入?
原理:使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分也执行,是在数据库完成sql指令的编译后才套用参数运行。
简单的说:参数化能肪注入的原因在于语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑。
4. 盲注是什么,怎么盲注?
盲注是在SOL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。
盲注的手段有两种:
一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入;
一个是通过 sq|语句处理时间的不同来判断是否存在注入(time- based),可以用benchmark, sleep 等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。
5. 宽字节注入产生原理以及根本原因
产生原因:
在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,由于OXBF27是两个字符,在PHP中addslsh和magic _quotes gpc开启时,会对0x27单引1号进行转义,因此0xb627会变成0xbrfsc27。
而数据进入数据库中时,由于0XBF5C是一一个另外的字符, 因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。
根本原因:
character_ set client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、 mb convert encoding使用不当。
解决办法:
统一数据库、Web 应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。或对数据进行正确的转义,如mysql_real_escape_string + mysql_set_charset的使用。
6. mysql 的网站注入5.0以上和5.0以下有什么区别
5.0以下没有information. schema这个系统表,无法列表名等,只能暴力跑表名;
5.0以下是多用户单操作,5.0以 上是多用户多操作。
7. SQL注入种类:
按数据的传递方式可以分为: get注入、 post注入、 cookie 注入
根据注入点类型分类: 数字型、字符型
根据执行效果分类: 有回显的注入、盲注、 报错注入、堆叠注入、宽宇节注入
8. SQL注入能做什么?
绕过登录验证,比如说使用万能密码登录网站;获取网站管理员账号密码;读取文件、写入webshell等。
9. SQLmap常用参数:
-u (指定url)
-r (读取需要注入的post请求的文本)
-m (批量跑get注入)
-P (指定注入参数)
-current-db:(获取 当前数据库)
-table (枚举数据库表)
-- tamper
-- tamper (使用过waf脚本)
10. 以下链接存在sql注入漏洞,对于这个变形注入,你有什么思路
demo.do?DATA= AjAxNg==
DATA有可能经过了base64编码再传入服务器,所以我们也要对参数进行base64编码才能正确完成测试。
11. 发现demo.jsp?uid=110注入点,
你有哪几种思路获取webshell,哪种是优选
有写入权限的,构造联合查询语句使用using INTO OUTFILE ,可以将查询的输出重定向到系统的文件中,这样去写入WebSheill使用sq|map -os-shell原理和上面一种相同,来直接获得一个Shell. 这样效率更高。
通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,再在后台通过改包上传等方法上传Shell。
12. SQL里面只用update怎么利用?
先理解这句SQL: UPDATE user SET password= "MD5($password)',homepage=' $homepage' WHERE id='$id'
如果此SQL被修改成以下形式,就实现了注入。
方式一:
修改homepage值为http://xxx.net' userlevel='3 之后SQL语句变为: UPDATE user SET password='mypass',
homepage='http://xxx.net' , userlevel='3 ' WHERE id='$id' userlevel为用户级别
方式二:
修改password值为mypass)' WHERE username= 'admin'# 之后SQL语句变为: UPDATE user SET password='MD5(mypass)' WHERET username= 'admin'#)' , homepage='$homepage' WHERE id=' $id'
方式三:
修改id值为' OR username= 'admin' 之后SQL 语句变为: UPDATE user SET password=' MD5($password)';
homepage= '$homepage' WHERE id=" OR username= 'admin'
点个在看你最好看