vlambda博客
学习文章列表

面试题: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'



点个在看你最好看