SQLi

SQLi in ORDER BY

Волько посмотритС, ΠΊΠ°ΠΊ ΠΊΡ€ΡƒΡ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ RubyOnRails выглядит SQLi Π² ORDER BY: Client.order(:first_name) Π’.Π΅. Active Record Query Interface послС Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° построит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос: 'SELECT * FROM Clients ORDER BY #{:first_name}' , Π³Π΄Π΅ #{:first_name} - это user input. ΠœΠ΅Ρ‚ΠΎΠ΄ .order() Π½Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ ΠΈ Π½Π΅ экранируСт ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. А Π·Π½Π°Ρ‡ΠΈΡ‚, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ Blind SQLi c подзапросом Π²Ρ€ΠΎΠ΄Π΅: ORDER BY 1,(SELECT 1 FROM SLEEP(5))-- , Π³Π΄Π΅ дальшС ΠΌΠΎΠΆΠ½ΠΎ ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ Boolean-based, Time-based ΠΈ ΠΏΡ€. P.S. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΊΡ€ΡƒΡ‚ΠΎ?! ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚ ΠΊΠΎΠ΄, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Π²Ρ€ΠΎΠ΄Π΅ Client.order(:first_name) ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ SQLi. Π’ΡƒΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ€Π΅ΠΆΠ΅Ρ‚ Π³Π»Π°Π·, Π½Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ, Π½Π΅Ρ‚ опасных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, казалось Π±Ρ‹ ΠΈ ΠΏΡ€.

SQLi: Active Record β€” Rails ORM

Как выглядит Π² ΠΊΠΎΠ΄Π΅ SQLi

def index
    ...
    name = params[:name]
    @projects = Project.where("name like '" + name + "'");
    ...
end
# Unsafe
st = ActiveRecord::Base.connection.raw_connection.prepare(
    "select * from users where email = '#{email}'"
)
results = st.execute
st.close

# Safe
st = ActiveRecord::Base.connection.raw_connection.prepare(
    "select * from users where email = ?"
)
results = st.execute(email)
st.close
# Unsafe exists
User.exists? params[:user]

# For Example: ?user[]=1 -> 
SELECT  1 AS one FROM "users"  WHERE (1) LIMIT 1


# Unsage find_by
params[:id] = "admin = 't'"
User.find_by params[:id]

# from
params[:from] = "users WHERE admin = 't' OR 1=?;"
User.from(params[:from]).where(admin: false)

# group
params[:group] = "name UNION SELECT * FROM users"
User.where(:admin => false).group(params[:group])

# ...

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎ всСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, унаслСдованным ΠΎΡ‚ ActiveRecord::Base ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ where, find_by, exists ΠΈ Ρ‚ΠΏ

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ: https://rails-sqli.org/ https://rorsecurity.info/portfolio/ruby-on-rails-sql-injection-cheat-sheet

Last updated